{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LSTM AE based clusteing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {},
   "outputs": [],
   "source": [
    "from time import time\n",
    "from keras.datasets import mnist\n",
    "import numpy as np\n",
    "np.random.seed(10)\n",
    "import numpy as np\n",
    "import keras.backend as K\n",
    "from keras.engine.topology import Layer, InputSpec\n",
    "from keras.layers import Dense, Input\n",
    "from keras.models import Model\n",
    "from keras.optimizers import SGD\n",
    "from keras import callbacks\n",
    "from keras.initializers import VarianceScaling\n",
    "from sklearn.cluster import KMeans\n",
    "import metrics\n",
    "\n",
    "from keras.models import Model\n",
    "from keras import backend as K\n",
    "from keras import layers\n",
    "from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D, Flatten, Reshape, Conv2DTranspose\n",
    "from keras.models import Model\n",
    "import numpy as np\n",
    "import os \n",
    "from keras.preprocessing.image import load_img\n",
    "from skimage import transform \n",
    "import _pickle as cPickle\n",
    "import _pickle \n",
    "import seaborn as sns\n",
    "import sklearn.metrics\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.manifold import TSNE\n",
    "%matplotlib inline\n",
    "import gzip\n",
    "from skimage import transform \n",
    "import numpy as np\n",
    "from PIL import Image\n",
    "import matplotlib\n",
    "import os\n",
    "# For plotting graphs via ssh with no display\n",
    "# Ref: https://stackoverflow.com/questions/2801882/generating-a-png-with-matplotlib-when-display-is-undefined\n",
    "matplotlib.use('Agg')\n",
    "from keras.preprocessing.image import load_img\n",
    "from matplotlib import pyplot as plt\n",
    "from numpy import float32\n",
    "from sklearn import metrics\n",
    "from sklearn.cluster.k_means_ import KMeans\n",
    "from sklearn import manifold\n",
    "from sklearn.utils.linear_assignment_ import linear_assignment\n",
    "from sklearn import preprocessing\n",
    "from sklearn.utils import shuffle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load breast biohistology images for convolutional input"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "metadata": {},
   "outputs": [],
   "source": [
    "def loadDataset():\n",
    "    data= []\n",
    "    labels =[]\n",
    "    root ='/home/rkarim/Training_data/'\n",
    "\n",
    "    for rootName,dirName,fileNames in os.walk(root):\n",
    "        if(not rootName == root):\n",
    "            for fileName in fileNames:\n",
    "                imgGray = load_img(rootName+'/'+fileName,color_mode='grayscale')\n",
    "                if rootName.split('/')[1] == 'Benign':\n",
    "                    labels+=[0]\n",
    "                elif rootName.split('/')[1]== 'InSitu':\n",
    "                    labels+=[1]\n",
    "                elif rootName.split('/')[1]  == 'Invasive':\n",
    "                    labels+=[2]\n",
    "                else:\n",
    "                    labels+=[3]\n",
    "                  \n",
    "                transformed=transform.resize(np.array(imgGray),(508,508))\n",
    "                data += [transformed.reshape((transformed.shape[0],transformed.shape[1],1))]        \n",
    "          \n",
    "    data = np.stack(data)\n",
    "    labels = np.stack(labels)\n",
    "    #data,labels = shuffle(data,labels,random_state = 0)\n",
    "    \n",
    "    return [data,labels]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "metadata": {},
   "outputs": [],
   "source": [
    "x, y =  loadDataset()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \n",
    "     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \n",
    "     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \n",
    "     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \n",
    "     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \n",
    "     1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \n",
    "     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \n",
    "     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, \n",
    "     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, \n",
    "     3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]\n",
    "\n",
    "y = np.array(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = x.astype('float32') / 255.\n",
    "#x = np.reshape(x, (len(x), 508, 508))  # adapt this if using `channels_first` image data format\n",
    "data.shape\n",
    "data = np.reshape(data, (len(data), 508, 508))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of cluster: 4\n",
      "Input shape: (266, 508, 508)\n",
      "Timestep: 266\n",
      "Data dimension: 508\n"
     ]
    }
   ],
   "source": [
    "n_clusters = len(np.unique(y))\n",
    "print(\"Number of cluster: \" + str(n_clusters))\n",
    "print(\"Input shape: \" + str(data.shape))\n",
    "\n",
    "print(\"Timestep: \" + str(data.shape[0]))\n",
    "print(\"Data dimension: \" + str(data.shape[1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [],
   "source": [
    "from keras.datasets import mnist\n",
    "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
    "\n",
    "x_train = x_train.astype('float32') / 255.\n",
    "x_test = x_test.astype('float32') / 255.\n",
    "x_train = np.reshape(x_train, (len(x_train), 28, 28))  # adapt this if using `channels_first` image data format\n",
    "x_test = np.reshape(x_test, (len(x_test), 28, 28))  # adapt this if using `channels_first` image data format\n",
    "\n",
    "x = np.concatenate((x_train, x_test))\n",
    "y = np.concatenate((y_train, y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of cluster: 10\n",
      "Input shape: (70000, 28, 28)\n",
      "Timestep: 70000\n",
      "Data dimension: 28\n"
     ]
    }
   ],
   "source": [
    "n_clusters = len(np.unique(y))\n",
    "print(\"Number of cluster: \" + str(n_clusters))\n",
    "print(\"Input shape: \" + str(x.shape))\n",
    "\n",
    "print(\"Timestep: \" + str(x.shape[0]))\n",
    "print(\"Data dimension: \" + str(x.shape[1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "metadata": {},
   "outputs": [],
   "source": [
    "init = VarianceScaling(scale=1. / 3., mode='fan_in', distribution='uniform')\n",
    "\n",
    "import keras\n",
    "from keras import backend as K\n",
    "from keras.models import Sequential, Model\n",
    "from keras.layers import Input, LSTM, RepeatVector\n",
    "from keras.layers.core import Flatten, Dense, Dropout, Lambda\n",
    "from keras.optimizers import SGD, RMSprop, Adam\n",
    "from keras import objectives\n",
    "from keras.models import Sequential\n",
    "from keras.layers import LSTM\n",
    "from keras.layers import Dense\n",
    "from keras.layers import RepeatVector\n",
    "from keras.layers import TimeDistributed\n",
    "\n",
    "def LSTM_AE(timesteps, n_features):\n",
    "    \"\"\"\n",
    "    Creates an LSTM Autoencoder (VAE). Returns Autoencoder, Encoder, Generator. \n",
    "    (All code by fchollet - see reference.)\n",
    "    # Arguments\n",
    "        input_dim: int.\n",
    "        timesteps: int, input timestep dimension.\n",
    "        latent_dim: int, latent z-layer shape. \n",
    "    # References\n",
    "        - [Building Autoencoders in Keras](https://blog.keras.io/building-autoencoders-in-keras.html)\n",
    "    \"\"\"\n",
    "\n",
    "    inputs = Input(shape=(timesteps, n_features))\n",
    "    \n",
    "    encoded = LSTM(128, activation='relu',return_sequences=True)(inputs)\n",
    "    encoded = LSTM(64, activation='relu',return_sequences=False)(encoded)\n",
    "    \n",
    "    decoded = RepeatVector(timesteps)(encoded)    \n",
    "    decoded = LSTM(64, activation='relu', return_sequences=True)(decoded)\n",
    "    decoded = LSTM(128, activation='relu', return_sequences=True)(decoded)\n",
    "    decoded = TimeDistributed(Dense(n_features))(decoded)\n",
    "    \n",
    "    return Model(inputs=inputs, outputs=decoded, name='LSTM_AE'), Model(inputs=inputs, outputs=encoded, name='encoder')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_43 (InputLayer)        (None, 508, 508)          0         \n",
      "_________________________________________________________________\n",
      "lstm_61 (LSTM)               (None, 508, 128)          326144    \n",
      "_________________________________________________________________\n",
      "lstm_62 (LSTM)               (None, 64)                49408     \n",
      "_________________________________________________________________\n",
      "repeat_vector_14 (RepeatVect (None, 508, 64)           0         \n",
      "_________________________________________________________________\n",
      "lstm_63 (LSTM)               (None, 508, 64)           33024     \n",
      "_________________________________________________________________\n",
      "lstm_64 (LSTM)               (None, 508, 128)          98816     \n",
      "_________________________________________________________________\n",
      "time_distributed_6 (TimeDist (None, 508, 508)          65532     \n",
      "=================================================================\n",
      "Total params: 572,924\n",
      "Trainable params: 572,924\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "timesteps =  data.shape[1] # equal to the lookback\n",
    "n_features =  data.shape[2] # 59\n",
    "\n",
    "autoencoder, encoder = LSTM_AE(timesteps, n_features)\n",
    "autoencoder.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pretrain LSTM autoencoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "metadata": {},
   "outputs": [],
   "source": [
    "pretrain_epochs = 100\n",
    "batch_size = 128\n",
    "save_dir = 'results/'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 249,
   "metadata": {},
   "outputs": [],
   "source": [
    "autoencoder.compile(optimizer='adam', loss='mse')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 250,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "266/266 [==============================] - 9s 34ms/step - loss: 4.6612e-07\n",
      "Epoch 2/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.5406e-07\n",
      "Epoch 3/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2044e-07\n",
      "Epoch 4/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2054e-07\n",
      "Epoch 5/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2121e-07\n",
      "Epoch 6/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1501e-07\n",
      "Epoch 7/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1442e-07\n",
      "Epoch 8/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1357e-07\n",
      "Epoch 9/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1283e-07\n",
      "Epoch 10/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1154e-07\n",
      "Epoch 11/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1120e-07\n",
      "Epoch 12/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1074e-07\n",
      "Epoch 13/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1022e-07\n",
      "Epoch 14/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1053e-07\n",
      "Epoch 15/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1051e-07\n",
      "Epoch 16/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1032e-07\n",
      "Epoch 17/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1091e-07\n",
      "Epoch 18/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1002e-07\n",
      "Epoch 19/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.0969e-07\n",
      "Epoch 20/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1545e-07\n",
      "Epoch 21/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1020e-07\n",
      "Epoch 22/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1422e-07\n",
      "Epoch 23/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1500e-07\n",
      "Epoch 24/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1583e-07\n",
      "Epoch 25/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1591e-07\n",
      "Epoch 26/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1557e-07\n",
      "Epoch 27/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1535e-07\n",
      "Epoch 28/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1832e-07\n",
      "Epoch 29/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1702e-07\n",
      "Epoch 30/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1472e-07\n",
      "Epoch 31/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1522e-07\n",
      "Epoch 32/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1276e-07\n",
      "Epoch 33/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1317e-07\n",
      "Epoch 34/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1503e-07\n",
      "Epoch 35/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1199e-07\n",
      "Epoch 36/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1088e-07\n",
      "Epoch 37/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1208e-07\n",
      "Epoch 38/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1116e-07\n",
      "Epoch 39/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1622e-07\n",
      "Epoch 40/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1533e-07\n",
      "Epoch 41/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1538e-07\n",
      "Epoch 42/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1704e-07\n",
      "Epoch 43/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1183e-07\n",
      "Epoch 44/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2672e-07\n",
      "Epoch 45/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1429e-07\n",
      "Epoch 46/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1159e-07\n",
      "Epoch 47/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1601e-07\n",
      "Epoch 48/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2467e-07\n",
      "Epoch 49/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2066e-07\n",
      "Epoch 50/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1667e-07\n",
      "Epoch 51/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.4597e-07\n",
      "Epoch 52/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2495e-07\n",
      "Epoch 53/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2053e-07\n",
      "Epoch 54/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1923e-07\n",
      "Epoch 55/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.3471e-07\n",
      "Epoch 56/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1962e-07\n",
      "Epoch 57/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2185e-07\n",
      "Epoch 58/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1847e-07\n",
      "Epoch 59/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1436e-07\n",
      "Epoch 60/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2154e-07\n",
      "Epoch 61/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1636e-07\n",
      "Epoch 62/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1364e-07\n",
      "Epoch 63/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1834e-07\n",
      "Epoch 64/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.4518e-07\n",
      "Epoch 65/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.3170e-07\n",
      "Epoch 66/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2525e-07\n",
      "Epoch 67/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2588e-07\n",
      "Epoch 68/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2077e-07\n",
      "Epoch 69/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1622e-07\n",
      "Epoch 70/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1278e-07\n",
      "Epoch 71/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1756e-07\n",
      "Epoch 72/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1509e-07\n",
      "Epoch 73/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1306e-07\n",
      "Epoch 74/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1629e-07\n",
      "Epoch 75/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1615e-07\n",
      "Epoch 76/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1303e-07\n",
      "Epoch 77/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1585e-07\n",
      "Epoch 78/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1542e-07\n",
      "Epoch 79/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1466e-07\n",
      "Epoch 80/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1738e-07\n",
      "Epoch 81/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1670e-07\n",
      "Epoch 82/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.4205e-07\n",
      "Epoch 83/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2353e-07\n",
      "Epoch 84/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2101e-07\n",
      "Epoch 85/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1724e-07\n",
      "Epoch 86/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1790e-07\n",
      "Epoch 87/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1646e-07\n",
      "Epoch 88/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1661e-07\n",
      "Epoch 89/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.3181e-07\n",
      "Epoch 90/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1996e-07\n",
      "Epoch 91/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1620e-07\n",
      "Epoch 92/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1678e-07\n",
      "Epoch 93/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1826e-07\n",
      "Epoch 94/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1991e-07\n",
      "Epoch 95/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1729e-07\n",
      "Epoch 96/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1463e-07\n",
      "Epoch 97/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1316e-07\n",
      "Epoch 98/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1318e-07\n",
      "Epoch 99/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.1155e-07\n",
      "Epoch 100/100\n",
      "266/266 [==============================] - 6s 22ms/step - loss: 4.2176e-07\n"
     ]
    }
   ],
   "source": [
    "autoencoder.fit(data, data, batch_size=batch_size, epochs=pretrain_epochs)\n",
    "autoencoder.save_weights(save_dir+'/conv_ae_weights.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "metadata": {},
   "outputs": [],
   "source": [
    "autoencoder.load_weights(save_dir+'/conv_ae_weights.h5')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Build clustering model with convolutional autoencoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 252,
   "metadata": {},
   "outputs": [],
   "source": [
    "class ClusteringLayer(Layer):\n",
    "    \"\"\"\n",
    "    Clustering layer converts input sample (feature) to soft label, i.e. a vector that represents the probability of the\n",
    "    sample belonging to each cluster. The probability is calculated with student's t-distribution.\n",
    "\n",
    "    # Example\n",
    "    ```\n",
    "        model.add(ClusteringLayer(n_clusters=10))\n",
    "    ```\n",
    "    # Arguments\n",
    "        n_clusters: number of clusters.\n",
    "        weights: list of Numpy array with shape `(n_clusters, n_features)` witch represents the initial cluster centers.\n",
    "        alpha: degrees of freedom parameter in Student's t-distribution. Default to 1.0.\n",
    "    # Input shape\n",
    "        2D tensor with shape: `(n_samples, n_features)`.\n",
    "    # Output shape\n",
    "        2D tensor with shape: `(n_samples, n_clusters)`.\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, n_clusters, weights=None, alpha=1.0, **kwargs):\n",
    "        if 'input_shape' not in kwargs and 'input_dim' in kwargs:\n",
    "            kwargs['input_shape'] = (kwargs.pop('input_dim'),)\n",
    "        super(ClusteringLayer, self).__init__(**kwargs)\n",
    "        self.n_clusters = n_clusters\n",
    "        self.alpha = alpha\n",
    "        self.initial_weights = weights\n",
    "        self.input_spec = InputSpec(ndim=2)\n",
    "\n",
    "    def build(self, input_shape):\n",
    "        assert len(input_shape) == 2\n",
    "        input_dim = input_shape[1]\n",
    "        self.input_spec = InputSpec(dtype=K.floatx(), shape=(None, input_dim))\n",
    "        self.clusters = self.add_weight((self.n_clusters, input_dim), initializer='glorot_uniform', name='clusters')\n",
    "        if self.initial_weights is not None:\n",
    "            self.set_weights(self.initial_weights)\n",
    "            del self.initial_weights\n",
    "        self.built = True\n",
    "\n",
    "    def call(self, inputs, **kwargs):\n",
    "        \"\"\" student t-distribution, as same as used in t-SNE algorithm.\n",
    "         Measure the similarity between embedded point z_i and centroid µ_j.\n",
    "                 q_ij = 1/(1+dist(x_i, µ_j)^2), then normalize it.\n",
    "                 q_ij can be interpreted as the probability of assigning sample i to cluster j.\n",
    "                 (i.e., a soft assignment)\n",
    "        Arguments:\n",
    "            inputs: the variable containing data, shape=(n_samples, n_features)\n",
    "        Return:\n",
    "            q: student's t-distribution, or soft labels for each sample. shape=(n_samples, n_clusters)\n",
    "        \"\"\"\n",
    "        q = 1.0 / (1.0 + (K.sum(K.square(K.expand_dims(inputs, axis=1) - self.clusters), axis=2) / self.alpha))\n",
    "        q **= (self.alpha + 1.0) / 2.0\n",
    "        q = K.transpose(K.transpose(q) / K.sum(q, axis=1)) # Make sure each sample's 10 values add up to 1.\n",
    "        return q\n",
    "\n",
    "    def compute_output_shape(self, input_shape):\n",
    "        assert input_shape and len(input_shape) == 2\n",
    "        return input_shape[0], self.n_clusters\n",
    "\n",
    "    def get_config(self):\n",
    "        config = {'n_clusters': self.n_clusters}\n",
    "        base_config = super(ClusteringLayer, self).get_config()\n",
    "        return dict(list(base_config.items()) + list(config.items()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "metadata": {},
   "outputs": [],
   "source": [
    "clustering_layer = ClusteringLayer(n_clusters, name='clustering')(encoder.output)\n",
    "model = Model(inputs=encoder.input, outputs=clustering_layer)\n",
    "model.compile(optimizer='adam', loss='kld')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Step 1: initialize cluster centers using k-means"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 254,
   "metadata": {},
   "outputs": [],
   "source": [
    "kmeans = KMeans(n_clusters=n_clusters, n_init=5)\n",
    "y_pred_kmeans = kmeans.fit_predict(encoder.predict(data))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.24436090225563908"
      ]
     },
     "execution_count": 255,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.accuracy_score(y, y_pred_kmeans)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred_last = np.copy(y_pred_kmeans)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.get_layer(name='clustering').set_weights([kmeans.cluster_centers_])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Step 2: deep clustering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "metadata": {},
   "outputs": [],
   "source": [
    "#computing an auxiliary target distribution\n",
    "def target_distribution(q):\n",
    "    weight = q ** 2 / q.sum(0)\n",
    "    return (weight.T / weight.sum(1)).T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "metadata": {},
   "outputs": [],
   "source": [
    "loss = 0\n",
    "index = 0\n",
    "maxiter = 10000\n",
    "update_interval = 10\n",
    "index_array = np.arange(data.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 260,
   "metadata": {},
   "outputs": [],
   "source": [
    "tol = 0.01 # tolerance threshold to stop training"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Start training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 261,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iter 0: acc = 0.25188, nmi = 0.01993, ari = 0.00302  ; loss= 0\n",
      "Iter 10: acc = 0.25188, nmi = 0.01993, ari = 0.00302  ; loss= 0.0\n",
      "delta_label  0.0 < tol  0.01\n",
      "Reached tolerance threshold. Stopping training.\n"
     ]
    }
   ],
   "source": [
    "for ite in range(int(maxiter)):\n",
    "    if ite % update_interval == 0:\n",
    "        q = model.predict(data, verbose=0)\n",
    "        p = target_distribution(q)  # update the auxiliary target distribution p\n",
    "\n",
    "        # evaluate the clustering performance\n",
    "        y_pred = q.argmax(1)\n",
    "        if y is not None:\n",
    "            acc = np.round(metrics.accuracy_score(y, y_pred), 5)\n",
    "            nmi = np.round(metrics.mutual_info_score(y, y_pred), 5)\n",
    "            ari = np.round(metrics.adjusted_rand_score(y, y_pred), 5)\n",
    "            loss = np.round(loss, 5)\n",
    "            print('Iter %d: acc = %.5f, nmi = %.5f, ari = %.5f' % (ite, acc, nmi, ari), ' ; loss=', loss)\n",
    "\n",
    "        # check stop criterion\n",
    "        delta_label = np.sum(y_pred != y_pred_last).astype(np.float32) / y_pred.shape[0]\n",
    "        y_pred_last = np.copy(y_pred)\n",
    "        if ite > 0 and delta_label < tol:\n",
    "            print('delta_label ', delta_label, '< tol ', tol)\n",
    "            print('Reached tolerance threshold. Stopping training.')\n",
    "            break\n",
    "    idx = index_array[index * batch_size: min((index+1) * batch_size, data.shape[0])]\n",
    "    loss = model.train_on_batch(x=data[idx], y=p[idx])\n",
    "    index = index + 1 if (index + 1) * batch_size <= data.shape[0] else 0\n",
    "\n",
    "model.save_weights(save_dir + '/conv_DEC_model_final.h5')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load the clustering model trained weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 262,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.load_weights(save_dir + '/conv_DEC_model_final.h5')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Final Evaluation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 263,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Acc = 0.25000, nmi = 0.02000, ari = 0.00000  ; loss= 0.0\n"
     ]
    }
   ],
   "source": [
    "#Eval.\n",
    "\n",
    "q = model.predict(data, verbose=0)\n",
    "p = target_distribution(q)  # update the auxiliary target distribution p\n",
    "\n",
    "# evaluate the clustering performance\n",
    "y_pred = q.argmax(1)\n",
    "if y is not None:\n",
    "    acc = np.round(metrics.accuracy_score(y, y_pred), 2)\n",
    "    nmi = np.round(metrics.mutual_info_score(y, y_pred), 2)\n",
    "    ari = np.round(metrics.adjusted_rand_score(y, y_pred), 2)\n",
    "    loss = np.round(loss, 5)\n",
    "    print('Acc = %.5f, nmi = %.5f, ari = %.5f' % (acc, nmi, ari), ' ; loss=', loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 264,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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gTrElbTX2hIWLlxo/m/25ptvavDgwdmOy/haFRcLFy7MdHpiXFycpk+frvnz51sxKgC494rnz6EA7jmDwaD27dub72/YsOGu56xYsaL5dlhYWJ7jM47Jrk2wNWT8dT8lJSXXsTExMfme19vbW927d9dLL72kNWvWaNu2beY2wSkpKXr33XcLFGfG16u4vtZFKTk5Wfv375ckNW7cOMdER0qvdBYne/fuNV9rydfXV40aNZIk/e9//9O6deusGRoA3HMkOwBylLHr1rp167K9snxBZDwVK6fWvxnt2rUr232tqUyZMubbuV3oMS0tTaGhoYU+TqVKlfTuu++aE8QjR44oMTEx3/vXr1/fnJjt2bMnz8Qs42t9txW84ig2NlapqamSpOrVq+c6Nj8ttTOua7rT/tsabty4oalTp8poNMrR0VHvvfeePvzwQ/Npi2+++ab5wrYAYI9IdgDkqEWLFub20Ldu3dKUKVMKtCD7yy+/1IEDB8z3q1atav5V+fjx45m+YP/T4cOHtXv3bkmZf422tozXBboTX3Y2btyo6OjouzqWk5NTpgXrd76M54eLi4vuv/9+SekVpvXr1+c4NiIiwnyhV3d3d3Xu3LlwARdjGdc1ZbwG0j/Fx8fryy+/zHO+jGugrHna2+uvv26uRP373/9Wq1at5O/vr1dffdUc25QpU/JMhgGguCLZAZCrOXPmqHLlypJkXj/y999/57rPoUOH9PTTT+udd97J8iVq9OjR5tvTpk3L9nonly9f1uTJk83rJ5555plcL7pZlDp06GCO5dtvv8222nX48GFze9+c/PDDD/ruu+9yrdb8/fffOnbsmCSpWrVqBb7C/TPPPGNesD9nzhzzaVoZxcXF6fnnnzd/IR8yZEim6lVJUaZMGXPXutDQUG3ZsiXLmFu3bmnixImKiIjIc76qVauab9+5tlRRW7t2rTZt2iRJatasmbmpgiQNHDhQDz30kKT09+vChQutEiMA3Gs0KACQq3LlyunLL7/U2LFjFRYWphMnTujxxx9X06ZN1aFDB/n6+srDw0NxcXEKDw/Xjh07dPLkyRzn6927t4KDg7Vx40ZFRkbqscce04ABA9SsWTM5OjoqNDRUa9euNVeQOnXqpGHDhhXV081TpUqV1LdvX23YsEGxsbEaOHCghg0bplq1aikhIUF79uzRxo0b5eXlpXbt2uVY/Tl//rwWLVqkt956Sx06dFCTJk1UuXJlubi4KDo6Wvv27VNwcLDS0tIkpf8qX1DNmjXTs88+q88++0y3bt3SiBEj1KdPH7Vr105ubm46efKk1q5dq+vXr0uS6tWrp4kTJxb+xSnmnnjiCXOS+vzzz6tfv35q2bKlSpcurVOnTmndunW6du2a+vfvr++//z7Xudq3b68VK1ZIkl599VWNHDlSvr6+5uTTz89Pfn5+9+y5hIWF6e2335aU3nDigw8+yNJN8U476oiICH3++efq1KmT2rRpc89iAgBrINkBkKcaNWooKChIH374odauXauUlBQdPHgw1wt9VqxYUePGjct01fo73nvvPbm7uysoKEiJiYlatWqVVq1alWVcr1699N577+V5XZei9sorr+jkyZM6duyYoqOjtWjRokyPV6xYUYsXL872Od1x5zklJCSYW01nx9nZWc8//7wGDRpUqFgnT54sR0dHffbZZ0pLS9MPP/ygH374Icu4Nm3aaMGCBfes9XFx8MQTT+jgwYP68ccfZTQatWHDhiyNOR588EHNnDkzz2Tn/vvvV8uWLbV//36dP39es2bNyvT4hAkTFBgYaPHnIKU3tJgyZYq5Wjd9+vRsL1Tq6emp999/X08++aSMRqOmTp2qDRs25HqBXgAobkh2AOSLp6enZsyYobFjx2rTpk3avXu3Tp8+rZiYGCUmJsrDw0NVqlRRkyZN1LVrV3Xt2jXH6/I4OTnprbfe0sCBAxUUFKS9e/cqMjJSRqNRFSpUUIsWLfTYY49l6gZnS8qWLavVq1fr66+/1v/+9z9zJ7MqVaqoe/fuGjlypMqVK5drsjN27Fi1adNGISEhOnTokM6dO6eoqCilpqaqdOnS8vPzU9u2bTVo0KC7rgBMnDhRffr00erVqxUSEqKIiAilpKSoXLlyatq0qfr27auePXve1THsgcFg0AcffKD7779fa9as0bFjx3T79m2VL19eDRo00COPPKLevXvnay5HR0ctX75cX331lbZu3aqzZ88qPj7eXKm7lz766CNzc4w+ffqof//+OY5t3bq1xowZo08//VQRERF6/fXXtWDBgnseIwAUFYPJmm1iAAAAAOAeoUEBAAAAALtEsgMAAADALpHsAAAAALBLJDsAAAAA7BLJDgAAAAC7ROvpQupXva+1Q0AJ0VVlrR0CSpiJ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DUUBAAAAG1gs5fcqDaPRqKlTp+rEiROS8nKApUuX2rx+Jj8fHx+NHDnSevz+++8XaC2d3++//65ff/1VkuTh4aExY8bY/By7kp3ly5crNzdXY8aM0euvv65BgwZJytsIqF+/fho9erTee+89ffHFFzKbzVqyZIm6detmzyMAAAAAuBiTyaTp06fr4MGDkvJaPy9ZskStWrUq9T2nTp0qPz8/SdLZs2c1Y8YMpaSkFBizb98+zZw50zqjbOjQoWrRooXNz7BrGtvevXtlMBg0efLk647r0KGDnnvuOT3zzDNaunSpHn74YXseAwAAAFQ6rrxm591339XOnTutx82aNdP69eu1fv36Eq8NCwvTsGHDCp2vXbu23nnnHf3973+X2WzWtm3b1Lt3b/Xo0UM1atTQ2bNndeDAgQLPnDVrll1x25XsxMfHy9vbWw0bNrSe8/DwKLLkdOedd+r555/Xpk2bSHYAAACACiwxMbHA8eHDh3X48GGbrjUajUUmO5LUp08fvffee5o1a5aSkpJkNBq1ZcuWQuO6dOmid955x1oJspVdyU7VqlXl4VFw5puvr69SU1NlMpkKbB7k4+MjX19fXbhwwa6AAAAAgMrI7KD9byqaAQMGqGPHjvr666/1448/6uLFi0pLS1NQUJBatmypoUOHauDAgYXyEFvYlezUrVtX0dHRys3NlaenpySpQYMGOn78uCIjI9WhQwfr2Pj4eKWkpKhatWp2BwUAAADAdbzxxht64403yuz+gYGBmjZtmqZNm+bQ+9qVHoWGhio3N1enTp2ynuvcubMsFosWLVqknJwcSVJubq7efPNNSbZv+AMAAABUZhaLodxelYVdyU6PHj1ksVi0bds267lx48bJy8tL27ZtU9++fTVlyhT169dP3333nQwGg12t4QAAAADAUeyaxjZo0CCdO3dOvr6+1nNNmjTRnDlz9OKLL+rq1au6evWq9bP7779fI0aMcFy0AAAAgJsq7f43KJ5dyU7NmjX1zDPPFDo/dOhQdevWTT/99JMuX74sPz8/3XHHHTfUdxsAAAAAboRdyc711K1bV2PHjnXU7QAAAADghjgs2QEAAABQepW19XRZsr9ZNQAAAABUAMVWdl599VWHPeSFF15w2L0AAAAAd1SZWkKXl2KTnRUrVshguLH/wS0WiwwGA8kOAAAAgHJXbLIzYMCA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\n",
      "text/plain": [
       "<Figure size 1008x720 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from sklearn.manifold import TSNE\n",
    "%matplotlib inline\n",
    "\n",
    "sns.set(font_scale=3)\n",
    "confusion_matrix = sklearn.metrics.confusion_matrix(y, y_pred)\n",
    "\n",
    "plt.figure(figsize=(14, 10))\n",
    "sns.heatmap(confusion_matrix, annot=True, fmt=\"d\", annot_kws={\"size\": 20});\n",
    "plt.title(\"Confusion matrix\", fontsize=30)\n",
    "plt.ylabel('True label', fontsize=25)\n",
    "plt.xlabel('Clustering label', fontsize=25)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 265,
   "metadata": {},
   "outputs": [],
   "source": [
    "def vis_data(x_train_encoded, y_train, vis_dim, n_predict, n_train, build_anim):\n",
    "    cmap = plt.get_cmap('rainbow', 10)\n",
    "\n",
    "    # 3-dim vis: show one view, then compile animated .gif of many angled views\n",
    "    if vis_dim == 3:\n",
    "        # Simple static figure\n",
    "        fig = plt.figure()\n",
    "        ax = plt.axes(projection='3d')\n",
    "        p = ax.scatter3D(x_train_encoded[:,0], x_train_encoded[:,1], x_train_encoded[:,2], \n",
    "                c=y_train[:n_predict], cmap=cmap, edgecolor='black')\n",
    "        fig.colorbar(p, drawedges=True)\n",
    "        plt.show()\n",
    "\n",
    "        # Build animation from many static figures\n",
    "        if build_anim:\n",
    "            angles = np.linspace(180, 360, 20)\n",
    "            i = 0\n",
    "            for angle in angles:\n",
    "                fig = plt.figure()\n",
    "                ax = plt.axes(projection='3d')\n",
    "                ax.view_init(10, angle)\n",
    "                p = ax.scatter3D(x_train_encoded[:,0], x_train_encoded[:,1], x_train_encoded[:,2], \n",
    "                        c=y_train[:n_predict], cmap=cmap, edgecolor='black')\n",
    "                fig.colorbar(p, drawedges=True)\n",
    "                outfile = 'anim/3dplot_step_' + chr(i + 97) + '.png'\n",
    "                plt.savefig(outfile, dpi=96)\n",
    "                i += 1\n",
    "            call(['convert', '-delay', '50', 'anim/3dplot*', 'anim/3dplot_anim_' + str(n_train) + '.gif'])\n",
    "\n",
    "    # 2-dim vis: plot and colorbar.\n",
    "    elif vis_dim == 2:\n",
    "        plt.scatter(x_train_encoded[:,0], x_train_encoded[:,1], \n",
    "                c=y_train[:n_predict], edgecolor='black', cmap=cmap)\n",
    "        plt.colorbar(drawedges=True)\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 266,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Encode a number of MNIST digits, then perform t-SNE dim-reduction.\n",
    "x_train_predict = encoder.predict(data)\n",
    "\n",
    "#print \"Performing t-SNE dimensionality reduction...\"\n",
    "x_train_encoded = TSNE(n_components=2).fit_transform(x_train_predict)\n",
    "#np.save('%sx_%sdim_tnse_%s.npy' % (266, 2, 266), x_train_encoded)\n",
    "#x_train_encoded = np.load(str(n_predict) + 'x_' + str(vis_dim) + 'dim_tnse_' + str(n_train) + '.npy')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 267,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaMAAAEfCAYAAADsnan6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsnXVUlVkXh5976Q4xUFBRVAxA7FbsxAIVuxu7Y8bWMcbWMbC7Fbv1Q+zGQkXBFkHydnx/OINiURdBfZ+1Zq25556zz4aL9/eec/bZW6TVarUICAgICAhkIuLMdkBAQEBAQEAQIwEBAQGBTEcQIwEBAQGBTEcQIwEBAQGBTEcQIwEBAQGBTEcQIwEBAQGBTEcQIwEBAQGBTEc/sx0QEBAQEMj6REVFce3aNW7dukVISAjh4eG8ffsWiUSCoaEhVlZWFClShEqVKuHl5YWtrW2q7IuES68CAgICAsnRq1cvTp8+naK+pqamDB06lPbt26fYvrAyEhAQEBBIFdmyZaNgwYLY29tjYmKCVColNDSUO3fuoNFokEgkTJ48mXfv3jFo0KAU2RRWRgICAgICyeLv74+5uTmVKlXC0dHxq32eP3/On3/+SWBgIAAikYitW7fi7u6erH1BjAQEBAQEdIZCoaBZs2Y8fvwYAB8fH6ZMmZLsOCGaTkBAQEBAZxgaGtKkSZPE13fv3k3ROEGMBAQEBAR0io2NTeL/JyQkpGiMIEYCAgICAjrlvy06AAcHhxSNEcRIQEBAQEBnPHr0iB07diS+rlOnTorGCaHdAgICAgLpQiKREB4ezvHjx1m9ejUSiQSAUqVK4e3tnSIbghgJCAgICKSKoKAgunTp8s33RSIRjRo1YurUqejrp0xmBDESEBAQ+M2IjY0lNjb2i3ZLS0ssLS3TZdvOzo5p06ZRvXr1VI0T7hkJCAgI/ApERUEK88HJZDKqVatGTExMkvb+/fvj5+eX7PjQ0FA2bNgAgEajIS4ujpCQEEJCQoAPK6PatWszYcIE7OzsUuSTIEYZyPv3CWg0P/+vN1s2cyIj4zPbjd8e4XPIGuj6cxCLRdjYmOnGWJUq8Pz59/s4OEBgIK9evUKtVid5K70ro4cPHzJhwgSuXLkCQN68edmyZQvZsmVLdqwgRhlIZGT8LyFG2bNbEBERl9lu/PYIn0PWQNefg1gsIls2c90Yy58fwsK+3ydfPnj6VDfzfQWFQkHHjh25fv06AI0bN2bOnDnJjhNCuwUEBAQEdIahoSEjRoxIfH3o0CGioqKSHSeIkYCAgICATvHw8MDExAQAtVrN7du3kx0jiJGAgICAgE4RiUSYm3/cevxa5N7nCKHdAgK/IJGRkWzZsoEnTx5SvLg7Pj5tMDe3yGy3BH4TlEol0dHRia+trKySHSOsjAQEfjHu379HtepluBm8F8cC7zh+ci2eNSvw+vWrzHZN4DchKCgIpVKZ+LpAgQLJjhHESEDgF2PsuCH06l+BKTMb49uhHHOXtKB2vfzMmDExs10T+En5dJWTHHFxccyaNSvxdbFixVKULFUQI4HfhtjYWC5fvkBUVGRmu5JhSKVSLl68RAtvjyTtrduV5tixw5nklcDPzp49e2jVqhUBAQGJeec+R6vVEhQURJs2bXj48GFi+9ChQ1M0h3BmJPDLo9Vqad/Wh7OBp9DXF6NWa3B3LcOOXfswMjLKbPd0ip6eHnpiPaQyJYZGH/95J8TLMTb+tX5WgR/LzZs3uXnzJgYGBjg7O5M/f34sLS1Rq9VERkYSHBxMREREkjFDhw6lSpUqKbIviJHAL0+/fj0IDbvB7oO9yZs/G48fRdC/+xba+7Zm+649me2eTjE0NKRho4YsnX+WkePrIhKJUKnULF0QSMuWvpntnsBPiqGhYeL/K5VK7t27x717977ZP1euXIwfP57atWuneA4hA0MGImRgyBo4OeVg7dbOuBTNldh27Uo4fbpu4v79Zz/N6iiln0NkZCRt2zUjPv4dxV1zc+XiU1xcXPH335x490Mg7fyuGRhCQ0MJCgrixo0bPH78mJcvXyZWcbWwsMDe3p7ixYtTvXp1atSokeJs3f8hrIwEfmnUajUJCTIKF8mRpN2laE7kcgXx8fE/jRillGzZsnH40FkuXAjiyZNQ+vYqTsmSpTLbLYGfnAIFClCgQAHat2+fIfYFMRL4pdHT08Mumw3nA0OpXM05sT3w7CPMzUyxsbHJRO8yDpFIRMWKlalYsXJmuyIgkCIEMRL45Rk4aCTDBk5g3MSGuHs4cuXiU6ZPOkzPHgMRi3+vgFKNRsOhQwfYf2AnIkR4eflQr14DRCJRpvql1Wo5efIYm9duQ5IgoVGL+vj4tElyViHwayOIkcAvT69efTE1NWXunBlEvz+IhYUVI0dOoHfvfpnt2g9Fq9UyZEhfrl3/H63buaPRapkydSgnTx5h5sz5merbtClT2eq/hzKSIVhhyeKry9i1ZQ9bd29L9dmDwM+JEMCQgQgBDAK6JL2fw5Url+jZy5ddB3tgavphxZEQL6dp/WVs3LAPV1c3XbmaKp4/f0a1ilXpI3+AGR8KsWlQs86sEuMX9KdJk2aZ4te3+F0DGDKa32uPQkDgN+bMmVPUbVAkUYgAzMyNqF3PhdOnT2aaX+fO/Y9C+rUThQhAjB4uCe04eeR0pvkl8GMRxEhA4DfBwsKCqEjZF+3vI6Xpqu6ZXqytbYgTvfyiPUH/BTZ2v2aAicCXCGIkIPCb0KyZN6dPPOD61fDEtiuXnhIU+JgmTZpmml+enrWIM3zKbTah5cO29itucFN/Fb7thIu6vwvCyaCAwG9Cjhw5WLJkFX59epC/gB0ajZZnYVEsW7YOW9tsmeaXoaEhm3dspVPbjlyIn4axyJJ3mofM+nsWhQoVzjS/BH4sQgBDBiIEMPw+nDhxlNlLFhD25AnFS7gyauBQSpcuq9M5dPU5yGQyzp8/l3gXSZeXfrVaLdHR7zEyMsbU1DRVYzUaDVevXkYmk1GmTLksmy0iSwcwXDgKcun3+xiZQIW6uplPhwgrIwGBdLJ7z06G/jkGq1GjsHZ1JSQoCO/2rdi6dgvlypXPbPe+wNjYGE/PWjq3e+FCECMHjeLps8cg0tKgXhNmzp2JpWXyhdUiIiJYsWo5569fJX8eB2xsbClRwlXnPv7ybJwDEV+evyUhe+4sKUbCmZGAQDrQarVMmD6ZbH//jVXjxhjmy4eNry9WI0YwZfb0zHbvhxEa+pgObdrjGjqO4cpoBijCeXbEjM5tuyQ79uXLF1SvU41NL8N52aYVZ3La0aRVU44ePfQDPBfIKghiJCCQDuLj43j35jWmZZNuyZnXqMHtmzcyyauPSKVSevbsRNGieXAulBPPmuW4fv2qzudZvWIV7oruFKMlYsSYYEN9xVLu3r7P/fvfzu4MMGv+HMRNGmM3ZQoWtWph26cPdnPnMnz8aDQajc59FciaCGIkIJAOTE3NMDYxQfHZJULZvXvkdnTMHKf+RavVUq9eFc5fOMG4SQ1Yt6ULtermpnnzety7d1enc4U+DCOnKmkyVj30yaVfgvDwp98de/zUCQxLlUKrUiW2mVasSGx8PC9fvtCpnwJZF0GMBATSgZ6eHj269yZq1CgULz58ccoePCB60mQG9eqfqb4FBp4lLOwpy9d2oE79YjgXzkHPftXo3KMS48cP1+lcpSq489QoaSVZOXGEKy5RrFiJr46JiYmmfbeORLx5zZuJE3lYvTox+/YBoImPRyWTYmFhoVM/BbIuQgCDgEA6GT5oGCqVEn+vpmCgj4FYzMjBw/HxaZ2pfp09ewpLKxMKOmdP0l6zdhF2b9up07k6de7CmpXVOKUah5u6Mwm84YzJaJp6NcfB4esrxG79enIvmw2FL11CbGqK9NYtnvXujX6OHEgPHKBmrTpYWVnr1E+BrIsgRgI/DaGhjwkPD6No0eLkzJkzs91JRE9Pj3EjxzF80HCio9+TLZtdlkjuWbhwUWKipcRES7Cy/hhmHfLgLbbZ7L4zMvXY2dlx6PgR/pryF1tPeWJhZkmnHh3o0bP3V/s/exbO5SuXyBcYiPjf0HITNzey9erFi779KFe6DAuWrdKpjwJZm8z/FyMgkAzx8XF06dOdy9euYO7sTOzdu7Rp3ZYZk6ZnqRIQRkZG5MyZK9l+CQkJHDiwj4iICCpUqEipUmUypIRDs2Yt+OPPYYwdsZfJM7ywsTXjzu2XzJp2hDmzl+l8PgcHRxb+syhFfd+8eY2pg0OiEP2HkbMzzs7O7NmyS+f+CWRtBDESyPIMGzOCu+am5Dt7FpGhITYxMezt3p3Cq1fSvVvPzHYvVdy+fZOWbb0xLF4C8jry96rlVC5VmlVL/XW+mjIwMCBg30l8fb2oVXkuxib6aNTg5zeMxo0zL/0PgItLUaRh4ShevMAwT57Edtmx4zSuVDUTPRPILIQMDBmIkIEh/UgkEoqUcCbf6dPof1KVNeHiRfSmTuPCqaBM8SstaLVaylevgLJnD6yafhADjVzO206dGdO6HR07fv9OTno+hxcvnhMVFUnRosWzxBYiwPxF81i4YS2Wgwdh4OBAwv79qA8d5vSRUylaYWYWWToDg1+9lF16XXhEN/PpkKyzxyEg8BWkUimIxehZJb3Fb5AzJzHR0ZnkVdoICXlAVHw8ll5eiW1iIyPMunVl017dBhR8Tp48Dri6umcZIQIY2H8Qc8dOwH77TrRjx9FQbMCJg8eztBAJZBxZ5y9TQOAr2NraYp/HgfhTp7Co9TGFTezevVSrUi0TPUs9arUa9L7y/Kevj0adNS93xsbGAKQopU9aaNKkaaZmDBfIOggrI4EsjUgkYvbkGUSNHk3kwoXEHT/Ouz//RLltG2OGjcps91KFi0tRLPT0iT9+PLFNq1IhWbMWn0w+w/mcJ09Cad2oDu5FC+DuUgCfBrUIDX2U2W4J/MIIYiSQ5alWrQaH9xyibmwCDtt30ia7PWePnSVfvvyZ7VqqkMvltGjoRayfH8/r1uXVhAm8atqUokbGdOzQ+Yf5cOTIIbZt2/zN7AZSqRSfxnVocPUykUolkSolXteu4N2oLhKJ5If4KfD7IWzTCfwQpFIpu3Zt52RQIPbZs9OxbUcKFy6S4vFFirgwZ8acDPQwY4mLi6VFPU9yPH/GbKWS+6GhrAgLo8/QkQwePPyHhKjfvHmdTq2aUVCpIpdWw3iVip59BzB09Pgk/Q4eDMBFImX4J3nhhmi1HJdJCQjYQ+vWbTPcV4HfD2FlJJDhxMfHU69pfabu3saVUu7s1aqo17Q+Bw7sy2zXfhjLly6i4JNQjshkdAdma7XsU6lYu2QhPyKgVa1W083Xm/nv33M2Po5tCQnck8vZtmwxZ8+eTtI3PDwMD+mXKyCPhASePQv/ov1n58GD+2zevIGTJ49/ONcTyBQEMRLIcPxXr+CdfS6yr1qFTatWZBs2jOzLljFk9DCUSmVmuwd8yJMWHHybmJiMidA7sGUT/dVqPr3aWh0QxcVy8wdk97506QK2Mhnen7TlBAZJJOxctzpJX3f3khwxMeXTkAotcMTMHDc39wz39UehVqsZMKAnLVrU5cTpVUydPoQqVUoRFvY0s137LfmttukWLlzIokUpuyH+Hxs3bqRMmTIZ5NHvwf4TxzDt3jVJlgFTDw9irKy4ezcYd3ePTPNNrVYzZdxINm5YRx4DA54rFbRr15HxU2eip6ens3niZRKiPmtTARKxmDt3gilVqrTO5voaUqkEq69kebACpAnxSdpq1KjFvAIFaRdyn5FyOSJgppER4nz5qVUr6xVlSyv//LOIe/fPc/BUX0xMDAFYtTyIAQO6s3fv8WRGC+gaYWUkkKFERUUS8+olkj//JLJXLxIuXQJAq1ajjInBzExHl/3SyOJ5c7i1aQMP5DKC4+MIkcu5vXkji+bO1uk82Z0LM0Zfn//WXVpgllgMJibY2ek2T9zXKFeuIrdUKu580qYCVpiaUru5d5K+YrGYTXsPkbNbL7xz5qRFjpzYde3BloDDOhXoz5FKpRw4EMC2bZt58+Z1hs0DsHv3DubOm0afAVUShQigQ5fyPHhwXyhdkQn8ViujT3F1dcXNzS3ZflkpIefPRmRkJI08K1H1XQS+KhWPnz1jwrlzqMaNQyOR4Jg7D87OhTLVx9XLFnNIKiHHv69zAIulEhosX8LAYSN1Msf58+cIe/IApaEYBxVUFol4bGREhKUlSqmMqlWr62Se72Fubs6UWXOpMWwQ3VVK7FUq1puZYe3uQfPPxOi//l4tfYiVxRMZGYFjgYLo6en+6yI6+j07d27n6pUrHDl4hNx6HhhrbRmpGsnQ4cPpP8BP53NGREQwYsRAcuaywNTMMMl7+vpiDI0MkMlkOp9X4Pv8tmJUvXp1/Px0/4cu8JEVSxfiGRXJyk+KpnlKpZQdPx47pwKs3ZyxWQdSwpvYGD6Xw0LAax2dHUVGRtKlSxumzGxENc/CvHj+ng1rLnJ6yzXEMjlLFyzB3PzHrA59Wvni5u7Bto3ruP4+ir71GlK/fsOvZmXYvn0rEyaMoE2HUhQqZknA/hVs3LiKXbuO6Mzfmzev07qFD47K6jyQHcObLThTD4BYXrBoTgUqVq5A6dJlk7GUOo4cOUiVas7kK2DF1o1X8CidN3EL+czJEMzNLHFyKqDTOX8Y7YaCXPr9PkYmP8aXVPLbipGAbnj4MIS1y5fw/PEj3CtVoWOXHmTLlg2AoGNHmKpQJOlfHHAyMubvxSvIn98pEzxOSvkSruy6dZNPg5V3ARVck181p4Tdu7dTuVpBqnkWBiCPgw0jx9Un7Ml76tTqTKNGXt83oGOKFHFh/KRp3+0jlUoZP34YKze0pXCRDzsDTZq5MajvTtavX02fPul/iNNqtfTv6UeNuLkYY0U0bxOFCMCSPHjIerN10zadi5FSqcTAUEzHLhXo2n4tPTquw7O2Cw9D3nL4wF02rN+ZIVnUfwivAyAh4vt9zLIDWe/sTzgzEkgzZ8+epmntauTcsJYugWd5M38OdaqUTdxvz5YjB2GfjVEA77SaH3JOkhJGTZ3FABMTZotEXABmi0QMNDFl5JSZOrH/7t07cuf5ciWRN382lErVV0ZkPrdu3SS3g02iEMGHTBjNWpbg1KnD3xmZcsLDw3j7OoIStEGJFCO+rOhqqLVCkpDMU34aqFu3PqdPhBAXJ2P9tq40ae7O/XuvOHLwHsuXraNSpSo6n1MgeQQxEkgTWq2WcYP6sUYqYZJajTfgL5fjG/2e+X9NBaBDn/5MMjEl9N8xSmCsvgHFXd3JmzdfZrmehPLlK7D9wHGuNPaiX0FnrjT2YtuBY1SoUFEn9itVqsKJo49QKj/eX5HLlZw+/pBKlSp/dYxSqeTJk1Di4mJ14kNqsbCwIDoqAY0mab68yMgELCwsdTKHnp4eGq0a0OJETcL4H1E8TnxfhZxgU38aetXXyXyfkiePA8OHj6N1s1UsmHOap6FRnA98RpfOPahdu17yBgQyBGGbTiBNvH37hoiItzT8rL2zWk3j40cBqFmzDj1GjaXMjCkU0jcgXKWkcNHiLF2z6cc7/B1KlHBlof/6DLFdtWp1ChYsQa/OW/Dt6IFGrWX96iuUK1+VUqW+vDKwdv0apvw1Ba2hIYrYWJo2a8msKX9hbGycIf59jaJFi2Frm4ONay/RvnN5RCIREW/jWL38EjOmL/7mOJVKxenTJ3j9+jWlS5elaNFi3+zr4OBIvvz5ufZgOWW0fajDTPypjAddMcWOu2Zrca/sTP36n/+F6YYePfpQvXpN9u7diVKpZN3aSZQsWSpD5hJIGb9VPaNP7xm1adMGDw8Pnj59ilQqxdLSEgcHB8qWLUvu3Ll1Mt+vXM8oLi6WkkUL8Fyh4NNn5RPA8ILOHDl/LbEtPj6O4OBgcuTIToECzj/G6SyEUqlk8+YN7N+/A7FYTLNmbfDxafNFmPSRI4foO2Y42f9ZirGLC6r374kaM5baufKwYPa8H1pX6smTUDp29EajlWKf25ob18Po13cggwd/PcLw6dMntG7jhbW1PvmcbDgf+Jhq1WqzYMHyb4aDP3wYQosmzbCRu2CjLMoD8R4s7UyoXLkKDb3qU6tW3SxVyfc/snQ9oz1+KTszarZQN/PpkN9WjL5HxYoVGThwIB4e6buM+SuLEUDvjm3IeeI4C5QK9IFooL6JKS3+nEyXrj1+uJ+6Rq1Wc+PGNbRaLSVLlsrwWkCNvL146d0Cq0aNEttU798TXrMmd67fpUCBPD+0yKFWq+Xy5UtERUVSpky5757zeXnVompNWzp1+7C9KZMp6dV5Cz4t+9C167er8cpkMg4d2p+4mipbtpxOgwc0Gg0ikUinNgUxyhiEbbqvcP78eS5dusSIESPo3LlzZruTZZmxYCk927Uif/AtihkYcFkup5VPazp17pbZrqWbCxfO07NLD/TllogQoTB8z7JVyzP0cPvlq5cYOSddOerb2GBgYUFkZCQFCuT5xsiMQSQSUa5c+WT7vXz5gpCQByxdMzCxzdjYgB59KuC/dNN3xcjY2Pir95zgQ/DHnDnTOHr0AIaGhnh7t6V//yEYGRl9tb9Go+HMmVNcvXoZtVrNpZPHCLpxHQtjY3x92zPqzymYmGTNsGaB31CMnJ2dqV+/PuXKlcPZ2RlLS0tkMhlPnjzh+PHjbNy4kfj4eNRqNdOnT8fGxoamTbNWrZmsgrW1DdsOHOP+/Xs8fx7O7OKu2NvrZoszM4mJiaaDbzsaJayl8L+nYo84Qqd27bl07Qo2NrYZMm9Zj9KcP3kS4yIfs5nL7t1DT6UiTx6HDJlTF8jlcgwM9dHXT7qlZmpmiEyetsujEomEpk1rU7ZCDhatbIFUomDZor1073GV9et2fNFfJpPh074VD96+QVymNLLNm5mnVnMUeCOVMnTjegaEh7Fi05djBbIGv5UYdejQ4asXXQ0MDHBzc8PNzQ0fHx+6d+/O06dPAZgyZQqenp5YWqY+ikhnS+8sQPbsX4befnyvHFDuxzmTwezevZkC2lqJQgTgTD0Kauty4sRB+vTpkyHzzpj0J+WqViVSo8Gsdm3kISHEzZnDrClTyJ37gwB+73PILOzs3LC2tuHU8QfUrOMCfNji27LhOi1b+KTJZ3//beRxNGHMhI/RdH8vbkmT2v8QHh5C6dJJc/lN/2sJjw31sd+3l/d//UVbsZge/2bgzgdslMvIe+5/xMS8wdk5/eeWWfFz+Nn5rcTI2to62T6Ojo78888/NGnSBKVSSWxsLNu2baN79+6pnu9XPzP6HqGhj5nxx2hO/+8MliamtOrYhUHDRmFoaJj84EwmPPwlpvIvVyKmMgfCwl7o9LwgJiaanTu38exZGG5uHgTsCGDekgVcHjSYPPa5GThjDnXq1CciIu6HBjD8h0ajISzsKRYWlknOjG7fvsnqJQt58SQUj8pVGTN6KoMH9yLwzBOcClpz6ngoCpkJHef3TJPP54KCqFDZMUmbgYEeZSvk5+zZ8+TNWzjJe2u2bsNs2FBEenqI7t6lxmfZ4I0ADwMDLl26jpVV+lJ8Zekzo5+YrBeqkgVwcnKi0SeHyP/73/8y0Zufj4iICJrX96TM8aPck0rZHxXJ3X8WMbBHJwASEhJ4+fJFmmrHvHv3jpMnj3HnTrCu3U6kcuWqPDTajZKPFy6VyHhovIsqVXSXR+7+/XtUrlKKM4EbMDC9i//q6fTr15W/Jk/nWuBl9m/fS506379n8/r1K8ZPGk8tr3p06tWFCxfO68y/EyeOUsatFA1qNKZsyVL4evvy7t07jhw5RJvGdSmxewfDrl1BsmwxYwf3Y8uWvRQqUJ+Ilw506TSSgIATmJunbQWRL68TD+5FJmnTarU8uPcGR8e8X/QXiUTw770orasrxw0MkrwvBa7KFRQqlPKCjgI/FkGMvkHFih8vPT5+/Pg7PQU+Z/2alTSUShmr0ZALcAV2ymScPXWCHl27U9ylCDUqeOJRwp2dO7d/19b791FcvnyRV69eMmPKNMp6lOLPHovxaeRL/Zr1ePv2rc79L126LJVqlmOjaXVusYnbbGaTaQ3KVfP46oG+Vqtl7ZrVlHErjX0uWzwre3LsWPKZCkaM6E/v/hWYNb8Z3XtXxX9DW4oUM2XuvJRlf3j58gWe9TzZHRdDbL++3CjpRtsendixY1uqf+bPuX//Hr279qHm2xX4ScMZqHiBPKgIHVq354+hfmyTShmp0dAQWKpQ0DY2hs2rVzJw4FBmzJhLy5atvhlokBJatWpH4JnH7Nx2DaVSjSRBzvw5pwDTryaWbdWkGfEr/dGqVFh06sR6IyPm8iHC8x7gY2xMjVp1skQKKoGv81uFdqeGwMBAunX7EBVmYGBAcHDqn8R/1226Xm298T5+lM+LU9fRNyBE5EFr5X7MyM5zLrLLxJvl65dQrVqNJH21Wi2T/pjImjX+5DAszBtZCHpqE7pqzmNDfjRoOK0/Bm3pa+wM0E3C1ejo9xgaGmFqaoparWbXru3s2rwPrVZLC18vWrZs9dU7M8uWLmXpX+toIFmBPaV4zFEOm/Ri+bp/qF7d85tzlSrlwv+uDMPA4KPNkAdvGNw3gMuX7n4xxs7OnHfvPtYeGjZ6GIfFWuxGjUpsk966RXSfPgRfvYPBZ6uD1DBi6HDCNuWiunpCYpsGNQuN82Gofcerf+sc/cctwCeXPYG3HqR5zs8JDr7N6NEDCQ6+g1arpYanJ3/NmE/OnLm+6CuXy2nTyZc74WEYetZAdes2muvXkGk0WJua4duhM0NGjUuXQP5Hlt6mE0K7fz0+TSFvamqaiZ78fDgVLc7Fs6dp+0mSVBVwTaWkGXMxIzsADpSnqnQSS+Yt+0KMVq/2Z/+6s/SRh2Auz4GCBHbRgfPMoSELESOmmmoi82/k4eXLF+TOnfaw56Cgcwwb3pcXz18iEolo0LAh06fNxcfnw+XU76FWq5k3Zy6tJMfISQkAitAEhTSB2VP//qYY6enpodWCWq1JIkYKuQqDz+4zBezbzd+T/uTuszAK5sxF/xFjaNu+E2fPn8Ns6pQkfU3c3Ig0MCQs7Gm6ynO8CHuFnboEr6dbAAAgAElEQVRWkjYxemTXL8RL2RviIUk2uWeg8yjDEiVcCQg4SUxMNHp6+t/NFm5kZMSuzTsJCgrkypVL5GpfmsZbdmNmZqZTnwQyDmGb7hvcvfvxyTR79uyZ6MnPR4euPdhsaMgqPiRGfQ10MTBAKzYmL5WS9M2JG8/Cw7+w4b90NZ7SOZj/W2nIEDMasYSbrEOFHAB9jDDTtyEmJibNvp44cYw2vl706l+aCzdHcvzcQET64XTt+n0R+o+YmGhkMlmiEP1HXqrwKPTbqwQLC0sqVKjA2pUXEttUKjUrl56nWbNWiW0HD+7nT7/ezA1/ikKrZe3rVywZO5L1a/3Jbpcd5fPnSexqEhJQxESnWxjKVy3DY+O9SdokRPFCeYNqVaox1NCQ/x413gBjTE1p16d/uub8FlZW1ikqWyESiahcuSoDBw6ldeu2ghD9ZAhi9BVUKhUBAQGJr4Wy46kjTx4HNu85yJqSHpiLxRQyNETUtAVqY1MieZik7yO9A5Qu+2VOsKj3EViTP0mbGTnQokGJBIBnXEBjIKVQocJfjE8JGo2GPv170NK3LA0al0BPT4ylpQnjJzXk0eP73L59K1kbVlbWGBkb8Zak22rPCKKg0/f9mjVrEQf3hdKx9XqmTjhC8wYrUClt8fMbmthn4dQJLJVKqcOHbYxKwAaphPl/TaV3p27Ezp2H4l9B0sjlRE2bTrUatRLLeKSVjp068dbqPIcN+vOSq4RwgM2mdejQoRPzV6whrEw5HI2NqWxugYuREbW79qB16883ZgUEUs5vs02XkJCQ4ielOXPmEP7J03qTJk0yyq1fFje3kuw8egaFQoGenh56enoUWrKEJTObUEPyF3a4cF+0m+smizk47NAX4ytWrMKdo1uorB2R2PaIQxhizmOOEy1+yGWj+fw9Z06a0/Rcu3YFrViLm2vSMwg9PTFOBbPx7Fk4rsnUNdLT02PAoIGsnN2G+pKViWdGJ0wG8c+YJd8d6+DgyNmzVzhx4hjPnoXh61OS8uUrJEld8zA8jM9ze5cFXkVFUadOPfzCnzLXqykmjo5IXr6gQvmKLFn4T2p+DV/F2tqGwyeOsmDuPE4c6YyVlRXDe30QHLlcjr1Tcc5eucE1Odha58a1tG7T+Aj8fvw2YrR69WquX7+Or68v1apV++p9l9evXzNnzhz27duX2Fa7du0suzJ6+DCEDZs38C76PbWqVKNJk2bpOrTWBXK5HD09vUSB+PT33LtvX+zz5OKf+bP435tXlC1XjoDRByhY8MuzjdF/jKJxUCNk0kicVHV5Lb7KBcNZeDVvxOvwdeR2yMmunruSFYvvIZVKURuZcursUxp5fbQjkSi4feM5xYoVT5GdPv36YWxizMK5vryKeEphJzcWTJyHp2etZMcaGBh8NzN14Xz5CQx5wKePQ5eA3LbZMDIyYmC/gXTr1I2QkPvkzJlLp5kacuTIwZTp05gyPWn7sIFDuXsonv6KR5iRg6cRZxjc1xe7bdkpX75CqufRarVs3bKJRXOX8urNc9yKezBm4ijKlk0+FVFG8fr1KxQKBY6OeQWR/YRHjx4RGBjItWvXCAkJ4e3btygUCszNzXF0dKRMmTJ4e3tTsGDBVNv+baLpPk2SamxsTJEiRXB0dMTMzAy5XM7Tp08JDg5G9UmJbBcXFzZu3JjmMssZGU23b99uBo4cgrmPDyJ7e5QB+8lnaMSeLbt0Xm4gJdFD9+/f448h/Qm6fg19sZimDZswYebf6Tq7CA8PY+nCJdy8egcn57z09uuFq6t7mu19jkQioZi7CyITfVo3L4a3tztRURJmTT+GiZE9+/YeS7VNrVar0y+vw4cPMrpXF/ylUmrwQYi6mZjSZ9I02nfqqrN5UkpkZCRlSnrgJw/D+JN87ZdZirb2cdZsWpOsjWvXrjB51nRuXr9Gzty5cS1YhAtH71BXuogclOAhBzllMpzte7bj4VE6WXu65OnTJwzu0Yl79++hLxKRPWcuZv/jn6Ta7O8YTXfu3DmmTZvGo0ePUtTfx8eHMWPGpCr467cUo+TQ09OjZcuWjB49Ol2RdBklRjKZjOIeRbHz98fE1RUArUbD227dGNGoKV266DZjdnL/+N69e4dnhZKMj4ujm1ZLAjDOwJDrRYqw70Rgln6y3LFjG0PHDsfQwR7lyxfoadTY2ObkzPHALHMAfuDAPuZO+oO7YU8pmMuefiPH0sa3fab4Ehx8m45ePeken/SqwzPOc6HgAE6dP/nd8bdv38TLpymWw4ZhUbMmspAQXo0ZS5lXbamnnpHY7zJLUNY4woZtGzLk5/iP6Oj3zJw+kwP7DqCnp4c84Q0jpRIGaDToATuBvmbmnLl0MzGQ6XcUo+XLlzNnzpzE12KxGBcXF/Lly4elpSURERFcuXKF2NiPBSFLly7NqlWrUvxw/Nts03Xr1o0yZcpw7do1bt68yatXr3j//j3R0dHo6+tjaWmJs7MzpUqVonnz5uTJ82MzJKeGGzeuYejgkChEACKxGJPWrdm7e6/OxSg5tmxaRwOFgn7/PtcYA0uUClyehHL58qUUZX7OLLy9W1GihCsbt27k3fv31K3uSePGTTN9u/NTGjXyolEjr0xJB/Q5Tk4FiFG9JJowrPlYrfex3iE8yia/ap254G8s+/XDpnVrAMyzZyfvmtVca9SGWuqJ6PPhHpATtdh9Z873TKUbhUKBV/0mWDwrR3PlAR5zjDcMYygfK9z6AIfUKrZv20TffgO/bew3oVixYrRq1YqGDRtiZWWV5D2JRMKiRYvw9/cH4OrVq8yfP5+RI79eA+tzfhsxMjU1pWLFikkyK/ysmJiYoIqL+2JLSB0bi5npj3+af3LvHpVkSbMzi4CyWggNfZSlxQjAxaUok/+cknzHH4BarebChSDi4uKoUKEi1tY2me1SEszMzOjnN4B1ixrhKZ1NNgpxT7SDmybLmDHoSLLjbwffxqR30pISRk5OiEyNiJO/xAYntGgJZitWNla8fx+VYVnSDxzYh/qNDQ2VyxEhIowzlMSAD7fiPlJMJuNReFiG+KBzPNqBSv79Pvqpv/ibP39+Fi9eTO3atb/Zx9TUlBEjRqBSqVi7di0A69evp2/fvlhYJJ8W6rcRo18JN7eSWOkbELNzJ9beH2rBqN6/R7LSn44Tpv5wf4qVKs3JgwH0lkoS21TAWa2GrsVLfHvgL4JarebkyWNcunQBpVJJrVp1qVy5aqqrlN65E0z71u3Qk1hjJsrOM2Vvxv3xB13TkKQ3Ixk8bAh58tqzfOEfvI14TbnyFQgYd4ACBZI/tHZyKsCT4GCMC38Me1e+fYtCEoWcWN7zlG1URcQLnJ+bUN7NBb8hw/EbPFznP8eNazfJm1Af0b+5JPJQngBEyIH/vq61wF4zMzpW/DymMWsSIrqAUvT9e3cGIisKk7pAk7p166a4r5+fH5s2bUKpVKJUKjl//nyKxgti9BMiEonYsHId3u18eLNlK/r29sScO0f3Lt2pW/f7iTUzAp/WviydN4uxCjl91GpigXFGxhQrXVanAQdZkfj4OFq1bsLrl095/zqa4sDBpYsQZc/Bup0BFCnikiI7KpWKtq18qRgxBTc+nAdFEcpfk6tSslRJSpXKOhGdIpGI1q3bpule0ZA+fnTq2wODXLkwrVgR5bNnRI0Zg4e7B1vu1kEV/47RaBkNiCQSngPV58+huHtJataso9Ofw6lgfoJMg/j32hq5KUVOauHJASajwQRYYGSExDEvDRsK1ztSioWFBYUKFUpMHPDixYsUjRMuvf6kuLgU5cbFGyweOZY/Gzfj/Okg/hjzR6YEC1haWrH36BlCG3lR0syMejY25O3Wg+Ubv58E9Vdg7tyZGJnEo46M44Zaw0W1hlCtljFv39DZpykajSZ5I8D58+cwktolChGALQUoLe/PpnWbMsr9FPH69SuWL1/CggV/c/funXTZqlq1Ogumz0I9cRKPXF153aIl7StWJWDPfvYeCMDaxJiRkJj3zgEYLZGweUX67059TosW3rwwDOSSaBEqFCiQYC0uSYilLSOdC9MnvxOOffzYcfD4T1H6JCuR5Pgghdn5hZXRT4y+vr7OnxbTSp48DixYuTaz3fjh7N+/G5eCJgyQK/mvZJsI6AYsjIvj4sXzVEzBFk9cXBymoi/TTplqchAddVOnPqeGgH27Gda/F021YKVW0Wb2X/h07MK4ydPT/ODTuHFTGjXyIiEhHhMT08Tks3FxceTQ1+fzVLT2QHRk5Bd20oulpRV79u9jqN8wZt8eBSKoWL4axxeezdKVdbM6CoUisTgpgL29fYrGCWIk8MsQHx+Pv/8/HD0agJGxMa18OtKqlW+qz25SizRGiv1nEfwiIJeIFOfNc3R05JH0DFdYTkk6oY8RGtTcMV3DkCYd0+VffHwchw8fJC4ujho1auLkVCBF42Jiohnm15tTMhn/bbb+oVJResMa6jT2okKFSt8d/z1EItEXtY5cXd0I02gIhsRMf1pgrbEx1Rt7pXmu71G4cBECjgQQGxuDWCxOc/0lgY8cOXKEhIQE4MPnXKFCys6nhG06gV8CuVyOt09DLl/dTS8/V3za5mWl/1+MGDEgQ+f18mpJpELLGhMDPt2QCwcuKVUpykgw5a8pNG7phXntGpwosZiZRvac4k82mXqSq7ghTZu2SLN/QUGBlHUtwsHhg7n/51gaVa/A9InjUjT21KkTVNLT49NTP1ugp1RKwM7010z6HBMTEyZMm00dExP+EovZCjQ3MeF+7jx06pK2II5nz8I5cCCAW7du8L0rlZaWVr+dEL169Yrnz58n+e/Te0JpQSaTMXfu3MTX9erVS3GeRGFl9JMTGxvDrVs3yZ49R4oPy79GXFwsCxYvYM+h/ejr6+Pb3JvePfv+NHvlAQF70DdIYM6itonbRxUrF6BBzSX07j0wXeUUvsfAgcM5d+4Mt7WvqaEvppdKw2tgrrExQ0eOTTYs+fjxo6xYvwYT75YYFylCjgYNiD9zhoujxzJzynRatPBJ82cgl8vp1dGXLQnx/BeQGwmUW72Syp61vyjbkRVo7duOwi4ubFy5jMA3r6lYtz5z23ZMdRYUtVrN0FHD2L1vF5alSiMNCaFAHge2rNmIrW36ksj+KrRr1+6L4IL+/fvj5+eXZptTp05NtGlsbMygQYNSPFYQo5+Y+Yvn8/e82ZgXLoz0+XMK5S/A+hVryZEjR6rsKJVKGnt7EeHogNm4scSHhLDowD6Crlxi8+qNGeS9brl4MZBadZ2TnGOYmhlRqYozly9f/KoYXbgQxMaNq4iOjqJ69Xq0bdsh1Rk3zM3N2b//JEeOHGTr1k0sfPqE/AULs7RHr2S3sWJiouk9uB/anDkRm5gQe/AgEfPmkW/9ekwd8pA/f4F0PQycO/c/Cmo1fHozJBvQXyJh96b1yYqRp2ctRqhU3ITE1VEUsNzEhAUtW31nZPrw8CiNx+Ll6bKxavVKDt25Sd7Tp9EzN0er0fBy6lQGDB/MBv91OvL052bjxo1fBBdYWlp+o3fybN++nW3bPq6YR4wYgZNTyivrCmL0k3L06CEWrvXHYf9+DHLnRqtW83LuXLr07caBHQHJG/iEgwcDeKuvj1GxYrzt1o0CBga8Uiq5or7FyZPHaNOmZQb9FLojZ057noU9/KL9Wdj7r4qzv/8/LFj4F526lcUuuzUH9q5h+/b17N59NNWCJBaLadCgMQ0aNE7VuOmzZyCuVAmnWbMSRfTd8uW8njgRE3MzZDJpqux9jkql5GuJWEwBlSKZi5F8KI8xZ9EyPPv3opkWLNUqthoY4NOhM+XLp/3yuFarJS4uFiMjY51UXv0aq7dswHLEcPT+XVGJxGJsBg/mTOXKxMbGYGlplYyFX5+UBhakhMDAQCZOnJj4ukmTJrRr1y5VNoQzo5+U5evXYN6vHwa5cwMg0tPDdsAA7ty9Q3gqb4tfvnYFVf58aOfPJ1gmIzgujjcyGT1USiaNGJIR7uuc1q3bczDgDkGBj9FqtajVGjauvUh0tIrq1Wsm6RsbG8P0GZNYvak97TtXoH6jEixY5o2VjYotWzI2F9qn7N2/j2y9eydZzdl27EjChQskhDykXLnUZ8D+lEqVqnJdpeLTqkwy4B9TM+q1SNnKpolXc85cuknB8RMwHzmWLYdOMn7yjBRH0oWGPmb82HF0bNOJBfPncezYYWpUqkEJFxcKF3RiQB8/4uN1n+IoPi4OPdukW6RiU1PEBgZIpekTeYGk3Lx5Ez8/P5RKJQBVqlRh2rRpqbYjiNFPSuT79xjkSlqHR2RoiFG2bERHv0+VLcfcDuidPs0UqZT/4qz0gelaLRGvXxMaGqobpzMQR8e8LFu2jinjT9Ko1j/UqbKQIwdesWXz3i/qHV29egWXorlxcPyYakckEtGoaTFOnz76w3wWi8VoP7+H9KEWOdMnTk13uXtzc3P+mruYmsbGDDAwYDLgYWpGwRqeNGyY8lVcrlz29OzZl4EDh6a4rAZ82Cas61mHe6tNMDvpw4HZD+jSrgvOj/swQhVLf0UoIfs19Oik21yK165dQSqR8H7r1iTt8SdOkDOXPTly5NTpfL8zISEh9OzZE4nkw83hkiVLsnDhwjRtLwvbdD8ptatUY9O+fZhV+nguIbt/H3VkJEWKFE2VLR+f1sydMJa8n7UbAHmMjIiMjMTCIuuXXq9e3ZNLl+7w4MF9jI2NvxnCbG1tTUTEl7n9It7G6TwPmlar5dy5/3HiyCHMLCxo4d06MW1OC69m7Fy+HKOZMxH9G34e5e9PmYqV8NVRVu5mLbwpWao0u3Zs5U1MDFPr1qdKlWoZfjlaq9UyfOAIGkpX4kJTAFzlvhgxmNfcRIwYM7JTST6eledL88cfo/H17UDRosXSNe+bN2/waeeD2YABRK5cyfP377Hw9EQWHIxs9242+K/P0lnkfybCwsLo2rUr0dHRABQuXJjly5en+SHqtykhkRlkZD2jqKhIajWsjcLdDeMGDVCGhxO/YiXTxk+kTSvfVNsbNqgv6s0b2fDJn8NdoJqZGc/fvSMuTqlD7zMXrVZLDc9yeLUoQPvOHyqUhodF0bXdRlYs35ymAnGfI5PJOHBgHysWzCUm9DGd5DKi9A1Yr6/H5DkL8PZpQ1xcLM3btOSZJAGDShXR3LmDwatX7N8RgKPj548Gui9dkJG8efOGimXKM0QegfiTDZi33GELzRjAQ66LVnHCaBB1GhfC3NyIwwfu0aFjd0aN/CPN885b8Df+j+6TbepU1DExvN+2DdmtWyiuX+evUeN1IvJZuYRESPg8lKpkctPpW1E4b8qj3L7Gq1evkkTj5c+fn40bN2JnZ5dmm8LK6CfF1jYbpw6fZPUaf05u3oqVmTk56tTl+rWLGBsa0qiRV6rKIIz5YzKNT52kY+Q72igUPAamGxnh5FyMZg1aU612Fdq265BlavykB5FIxJrVW+ncpTXbNl3Hzs6SBw9eMnbMBJ0I0ZMnoXh7N8TMXITm4StuqTSYAqiU9FApqTx0AHXrNcDS0oqjAUc4ffoEwcG3yVeuMvXrN8qwQ/2UsG/fbpb+NZXQ589xdXFh8B+TqVy5aqrtmJqaoNYqUZKAER/v7yTwFiMsiecNxw0HsiWgM04FPnyB9ehbhVZNV1G/XmNKliyVJv/DXjyHQh8iJ/WsrLDr8WELMGrEyBSnZhL4PpGRkXTu3DlRiOzt7Vm9enW6hAiEM6OfGmtrGwYPGsaQ3v25fO4UWvFDcuR+wT/Lp9CyZYNUHdTa2mbjwOkg8gwcyiyP0qwvWoIErRXZb7XD8nQHNk09S5P6jRNvVmcUjx8/ZMLo4fRo04JFC/5O9flXSnFyKsDpU5dYvmwrw4fN5Mb1B3Tp0jP5gSlg+PD+tGpXghLONvj9J0T/Ugwor2/A2bNngA/nRjVr1mHAgCE0bdoiWSHSarWs9l9O+RLO2Oe0okHlMpw8mfqKtF9jy6b1TPXrzeSHIdyXSuh9/Ro923pz7tz/Um3LwsKSGtVqc9pgDBo+hA/LieMoQ7EgFzdYS4VKBROFCMA2mxnNWpYgIGBPmn+G8h6lUZ8+neSCq0YuJz7oHO7uHmm2K/CBmJgYunTpkpjux87OjtWrV5P730Cq9CCI0U+OWq1myJA+zFnYnNF/1qNDl4qs2dwOE7ME1qxZmSpbNja2DBk+mpXb93DvyXM6K85TStsLU+yoIB2LJiwXmzdlXLTZ2bOnaVyzClZr/Wl98jiPZs+gbpVyvHnzJkPmE4lEuLt7UKNGTZ3dvo+Jiebq1au061gOPUM9pF85npAChoZpK963ZMHfbJz0B1vevkWi1fLHwxAGdG5PYODZdPmt0WiYPflPtkilNAByAL7AXKmUeZPTtm02d9HfqIvfZKmpMzssGrPIyInyjQtTvLEl542nouLLhyWNhnSd6TRt2gLLyCjejRmD9PZtEi5e5G2PnlQpV4ESJVyTNyDwTSQSCT179uTBgwcAWFlZ4e/vn6q7RN9DEKOfnLt3gzE2EVOu4sc/CLFYTKu2JTl8ZG+abF67dpXcBm685gZzyctxRrGP7jyX3WTPtn26cj0JWq2WsQP7sk4qZZpKhS+wUSbDKyqShbOnZ8icGcGHoAgQiaCBtweLjA14+8n7p4F7IqhWzTPFNlUqFTEx0SgUCpbM/5ttUgnlAEPAC5gtk7Jo+uR0+R0fH0dUbAzlPmuvBdz598sntdjaZmP/0QNsCdjAsIXtOHP+LMtXrWDZquVcvnaD69de8vjhx9/Ou3fx7N15Cy+v5mn+OUxMTDi85yAtc+RGOWIk+tNn4Fe3Af5LUvdgJpAUhUJB3759uXHjBvChkN6KFStwcUl71pfPEc6MfnKMjIyRShVoNJokCUElEgUmxiZpsmltbU2UKoz99KIdh8hDmcTqm4fu9kYul6frXOP27ZvMnTudW7dv4ujoSJ/egylRwo33ke9o8FnfrioVrY4eglnz0jzfj8Ta2gY3d3e2bb5Ku07ladKlAkX9z1NfpSZSrM9lA0NWrNmEsfHXrqMmRa1WM3vaJFb7L0ehVGBnbY1aLqPIZ/2qAmMffXnhNzWYmZljamzMPaWST2MxrwBODo7psu3q6oarq1uSNjs7O6ZPm0vH1oOpVbcoRsZ6HDl4lx7d++HmVjKxn0aj4dKlC0RGRlK2bPkUZRextrZh0h+TmPTHpHT5LfCRefPmcf78+cTXzs7O7N27l717k3/gdXd3p2nTpsn2E8ToJ6dQocJks83Bzq3X8fEtDUBCvJxVyy/Sr8/4NNl0d/dAa6jATdqePHwo6iZChCttuK6/mJMnj9OgQaM02b59+yY+Po3p1b8SfQa14P6914wc1Y8BfqOQaTRIgE9DJN4CFjpMYKlQKDhwYB83r98if4F8tGjhrfPb+LNnLaZly4ZcDHpGYRdbcjjl5H8SEYMGDmdpc+8UbwnOmDSe62v8uSyV4gSciYigEfAAkghSIJA/X36mThjHhZPHyJ7Lng59/PD0rJXEnlar5cqVS4SFPaVECTdcXD7Kjp6eHr36D6LD/Dmsl0hwAc4D/U1MmDAqZYlVU4uPT2uqVKnK/v17USiUDNi/mIIFP6ZtCg19TMeO3ojEcnLltmbgoKf06e3H0KGjM8QfgW8TFRWV5PWtW7e4devWN3onRSKRCGL0OyASifjnn3W0aePF/r33cHC0JvDsQ5o0bkHLNOYPE4lEVK9eg4R9X4YXW4vypiuoYM7fU+kzoDK+HT5sCOVzykZuB2uG9Z9N1UpVGBf4P+aolIiBGGC8iSmtu/dO83yfEh39Hq/6TVC/sSFvQj3OmZ5j5rSZ7A7Ym64ks5/j7FyIoKAb7Nu3m2fPwhkzpi916tRLrNuTEmQyGevW+HNTKuW/dUkNoAXQTCxmvUaDO3AYGGZsDE9CKXYnmBlKBU/u32PExQv0GTeBrj0+/O4iIyNp1bE14VGRmBQtRtyEcVStWImVi1ckXlDsP2gYIpEIz0XziJNIyGlry/BxE2nUKOOqnNrb56ZHjz5ftGu1Wrp3b0eL1oVp1+lD+P27d/F08V2Nu3spateul2E+CWQOwj2jDCQj7xl9jlKp5NSp40RERFC+fMVks1QrlUoCAvZw7Oxp7GxsaNe6XZIn5f379zHRbx4dE86j9+8zi4QolhoV5mTgKfLly58mP0uWLMSqTW2SZD8AqFb2b/bsOcbIfj159fghxfT0uKBQ0MKnDVNmz9dJTaKxo0ZzY72chsrliP6tJXpJtIhI9+0EHN2fbvu65OXLF9SvWIpXn0VEhgBVzMwwMzUj/F0EJQsWIq9LUXIePcQ/CkViv4dABVNTrt0NxdTUlE69unDVyoJs48YhEonQyOVE9OlLt4pVGDZkRJI5NBoNEokEMzOzTLsgevfuHdp3aMrBk72TfPY7t13jSpAaf//NmeIXCPeMMgphZfSLYGBgQN26n5+4fB25XE6Ltt48liZg6OWF9vVr1jdvyJwpM2nZ0geA+vUbstp1LZtv1cZd0hsF8VwxnUPHDp3SLEQADg4OhNx/k0SMXr+KQa3W4uRUgD3HzxIcfIsXL14w1dVNpxU39+89QHPl/kQhAiil7cns4FFZLnlm9uw50BoYECyVJhaaAzgGlC9bnlXb9iRmkGjmWYn+nwgRQCEgr54e9+/fpWjR4hw/fJAC588niovYyAjLQQPZMGz4F2L0ocicbr4cv4dKpeLQof2cOnoGWzsb2rTzTXyIiouLw9rG9IuHEFtbU+Linme4b2klJOQB//vfGWxtbalXr2G6UzqlFn2H5oDq+32y6Nd+1vRKIEPZunUToRoVOTdtQvTv1pFZo0YMb9+Bhg0bY2Jigr6+Ppt3bGb79i0c2bcFPQMDZnWcSJ069dM1d+/eg5kwcQi5HaxxKZqLN69jGT/yAB06dE4MinB1dcfV1fS7idAAACAASURBVD0ZS6lHX18fNUm/tDWoQESGV4NNLQYGBgwaMZaW0yYyXyLBDTgI/GliwuYxH0Kt/xOW7LnsCb0TzKcnRAogND6eK1cuU6hQYQDEJkkDWvQsLZH9m1MsvcTERBMdHY2Dg2OKtiMVCgVtWrbmeXAcLgntCNN/zhr/esxZOIemTZvj7l6Sl8+juX/3FS7FPmSX1mq17N5xm5o1U5cNWteo1eovgni0Wi0jxo5gx97dmNeqieb1a0aMH8W29Vvx8Cj9w3y7rLlOPN+/C2iOGQXE+X6QRylHEKP/s3fWUVVl7xv/3KIbUcREHbsQsQNbVAwUQUQUu3XG7m7H7m7BwC7swhYxMDFRRBDJG9z6/YFeQBCwZub702etWcs57L3PPvfes9+933ieXxAHTgRi4O6uM0QABiVLYlDEnuvXr1K7dl0A9PT06NjRh8GD+32zW+L+/VBCQoIpUKAg1avXpEWLlsTERNOv+zQ0aiWKZBXe3p0ZPXpS9oN9J9p6uHFy5TTaKPwRkvLsl0VzqF6l9n9S5bNbzz5YWFsz5u9ZvHobQRVHR4Y2dWXtovkkxsdRv2Ub2nt44dN3IIODLlJLJqUUoABGAKW0WjZOm4QIKFG2PDH792PhlqoaG+/nR6OGjb9rjomJCQwZOJRjgYcwEJmhZyRk6qyptGzZOst+O3ZsJ/KOGh9pUMp3oYLSqg4MHdyYxo2bYmhoyLRpf9O76xA8OlbCzs6MIwcfkJSoT6dOvt8156+FVqtFpVKhVCqZMmUM/ju2I5cpqFSpIpMmzcbR0YlDhw6w78JZ8h8PRGSa8luKP3YMnx5duHXl1lfFC39V/DZGvyCMjQxRJ6Q3LlqtFlV8wg9zKyiVSvp078P5MxewFzjzTnAHE1shO/fuxMenK15ePkRFvcPCwhJDw29LQf9aDP7rL64GdWD1/bIUVjYgSu8WKrMo9iz59or/+/dDGTd9EpfPn8XE3IIu3p0ZMnjoV1ExZYW2bdvrElHWr1rEssnjGSKTkgtYc+0qe7Ztwm//MQZPnkaVkUPJp1anqLkCh4AImZSGs6exwX8P7Tt5oL51C2GZMqguXEB0L5QxB4591/w6enQkMhg6qc6Sl4q8lAUxbEA78ubNi5NT1S/2OxRwjPLSXrpNAUBeHMglLMaNG9eoVasObdu6U6JESbZt28D1y1G0adWXdu08/rHfi0qlYu6s2axbu5b4pPdYW1lRqWpe9h/rjaWVMUcO3qVjRzeOHDnL1oAdGPn66gwRgFmTJkQsXEhw8A0qV/68gus3PsdvY/SL4MmTx0yfNIOLQefR09Mj4eplzBo3RvyRTyp+zx5MNJof5lJYuWI5D868p68sDAkGaNFy5sVYBvcdzPbdfojFYvLm/X4Kka+BkZERew7t5fLlIO7cCaFgwdo0aNDomw1HePgrXNu2wKhPH+xnTEP59i0bZ87k+dBXrFi47IfOPSoqihlTp3JPLufTp+Yhk1LvwQP27QugU+duLJo1jenR0VQGHQO7NSBQKsmb146g00Fs2rKJJ3dCcazpTIfFqzA1/TZlz/j4ODzdPAm9/ZAC1GAzjfkDF1qyhmrykaxcvBqnTV82RkbGhiTz2YYILXJtQroarLJlyzF9+t/fNMfvxdiRY7iw8yHesguAlk1yJ2bMbYWefsqy2bJNBZ6FxbB+wyqUShWCTGQThPr6Op2f38gav43RL4DXr8Np0bQZlRIG00U7n3heEWDoxdP69bGuXQdVZCTCqCh2btnxw2In2zf5U0u2DMlHrVEBAmqqxjD/si1xcbGYm1v8kPt8LQQCAdWr16R69ZrfPIZWq+XChXNMnz0dfVdXrLp0AVKIOfWWLOFInbq8Hh7+Q5MvLl++SG2JBDu5XHdNCHSSJnH88AHc3T2xL1SY5OjodFIg4aS47SwtrTA0NGTYkOH8CIwcMhJCSzKUswgRoUTGdloRxFzya6tx5+XOLPt7+rgz5Pw4SkrbYEzKhugO2xCZKKhUqfIPmeP3IC4uFn//bfRVPMGYXDzmKMWLFtAZok8oW96Wg3se0K6FOxM3rcPMxQXBx82N9Pp1VBERODo6/RuP8D+H38boF8Dq5asoJetALe1IAMzJT0/ZTRbpFWZI/cYULFiIOnWcM4jQfQ/kMhn6pN91i9FHJBAjlysw/+8krn0VlEolvt5duHPlCXIRmHRNz/ItNDbGtExpHj9+lKUxioqKQigUYm1tnaP7mptbEJHJ9TciEebWKYt572GjGOLrTX6ZjJrAc8DX0JBOPl1/qGtLoVBw8PBeBqpe6NxsEgxpwHQC6Ihc/A6nmlmzbjds2IT2vldZvqYEf4gbkSB4TbzkGX7bftyG6HsQHh6OhSQfxoqUz9aG0ux7/AppkgIj49TEhWuXX1GmdDXatfNgz+EDBLdug6R5MwRv35J4+DCrl6z8JqG5XxH//rf+Gz8dITfuUkjZKN01QyzJb1CBP/4oTv36DX+oIQJo2qIJwZLl6a7dYwcFC9qTJ8/3K20mJSVx9+4doqOjv3sslUrF3r276TWwD8NGDyMkJPiLbbdv38rTK3F0k96iuLwp8qvp22rkchLu39cJ6H2Ohw8f0Ly5M9Wql6dK1bK0at2Ip0+fZNr27dsI/v57FoMG9eThwwe8NzJiPfCpcu0+sExPD8/O3QCoX78R4+cvwSd3biwkelQ2MqJy916Mmjg1R59DUlISL148J/mzNPHPoVQq0Wg16JN+R2GMDUm846GxP336ZSxkTQuBQMDYCeM5G3SOrjPrMXHFAG7eCfnPkJkWLFiQONUbEj5uASwoSElNG/r67uBBaATR0YmsXx3EsSMpbO9isZjtG7axYuJU3GTJdC9cjIunLn539umvhN9Frz8R/1TR661bN9m8ajlRr8OpXK8BnX27p3ODDRk0hNc78lNHncq+nIyMBRJbevXvhYODIw0bNv6iQfqWIr/379/TrJELRjFFKSxtTrR+CA/FAfjt9v8uN4xWq2Xp0vksWjQPm9xmREZ+wKVpc2bPXvxNu3+VSkX7Th6ExkSj5+aGNiaGxK3bGD9sJL4fF/m0cGveFrtrvSmNGzGEsdzAEZtJozFv2RJlVBRREyZSzdSczWs2ZuibmJhAjRoO9OhXBTd3B9Bq8dt6nW0bb3Px4q10sZJbt27SoUNrGjYtSanSNgSdf8H9e1GIk7UYJiViLRByV6Vk0oy5eHp1yvAZxcZ+wMTENEfxMKVSydjJ4/Dz24rYxASBQsGwv0bQq3uvL/ZpXLcx9vf7UYFUsbqTjOVNgT347/GnYMH/Xurw12LKhMkc2HCORrIlWPEH99jBKf2/sLQxJSEhkTq16zBq1GRd6vy34kcWvfqr9uYotdtDnHW247+BX9ZNl5iYyJ49ezh27BjPnz8nLi4Oa2trihYtSrNmzXB1df2fOF7vDdjFuD/78ZdCwR8aDbuCb9Bsw1r2n7ygcwH17NuDFvuak0talpK04gPP2S5wIq9GimrpQlbo6THNwpIdh47/sKQCa2trTp0/ze7dO7lx6SplixZgtfcFbG3zfte4AQE72bZ9FX57fclfwJLEBDnjRx5i3LhhzJ275KvH27cvgNDYGPL4+SH4aIxNXV2Z2KYNbq3bZohtCYVCtB/1eaIIRV9ujHrybu6PHIVEbIqZ2BbL5pkTi+7bt4ey5W3x8Eo1xp18q3Hx3AsOHz6Am5u77vrIUYMYMqoeLduk1Fu183Rk9rTjoC6GR3tvEhMTcXKqmmlxqkAg+Cr59EkzJrM/9A4Fjh1DbGOD4skT5vTpS25ra9q0aZdpn5nzp+PZ1oN3yTfIo6zMS4PjvDI6yeG9RzNVqf1fxJgJY8mVZzmrl3UgOvYtjuWrsXvKfpo2rf8/o7j7v4Rf8mR0/fp1hg0bxps3b77YpkSJEsyfP5+iRTN3t+QEP/tkpFQqcSxVhAPxcaQ9a3TX08O8Vz9Gjkut3bl48Tyjh47l6YuHCDVKWqDGT6PR+WnHikSE1HFmnf+eDPf5p+Wu3717h9/2bYS/CMepemVcXVvrTg3NmtXFt3cp6tZL3Y3GvE+ieYOl3L4dxtmzp1mzbD3vo6Kp06AW/QcNIE8e2y/ey7dvd25Wqoilh0e669FduzKna+8MhLB+fluZP3IjXtLTbMeVSvSgLO3RoEaAECnvWaZfjDv3QzPULs2cORWp8gr9B6eXj5g74wT5bRsycOBfQAqHnoNDSS7eHIpYnJr6/OxpNH18d3Hz5qOv+DSzRnJyMsXLFCPfoYNI8qZuFBJOn8Z0+UrOHDn5xb7h4a/YsG49YQ+fU6FyWXw6d8bKKmcxsP9l/JfpgP6XT0a/XMzo3r179OjRQ2eIJBIJderUoV27dlStWlUXPH348CGdO3fm7du3/+Z0s8TDhw8w16j53Onlk5zM+aOH012rWbM2Zy+dJfThI3JZmDIxjSECGKFWc/L8WeRpsrW+BTKZjKioKL51j3Pz5nVqVa3OsbkviNhSioXD/WhSrxFxcbEARL6LpFDh9Lt+SysjJHpiFs6bz4i+E8lztSs1ni3lzkYBjes1JCoq6ov3MzMyQRMbm+G6OjYuU4l1d3dPytcrxErDUrzjHjaUBkCICAECjMmFgciM9+/fZ+jr4ODIxXMv0slfq9Uags4/T5dSL5HoodVqUcjT07okxMu/uQ7s1Knj+Li1oFmNykwcPYy3b1NiIfHx8WgAsW16g61fvDgRb15nOWb+/AUYO34867euY/Cff2VpiJKSkjhx4hhnzpzKNiaVHW7fvsWo4SMZ2GcABw/uR61W6/6m0Wg4c+YU06ZNYuXKpVl+97/x38IvZYySk5MZMGAA0o8UKGXKlOHEiROsXr2aadOmsWnTJg4cOECBAilulqioKIYOHfpvTjlLWFhY8F6p4vNX+zVgYZW5m8bU1Ay1WsPnkQQJoNWSbqH8GsjlcoYOHkqp4n9QtZITlcs7cujQga8aQ6vVMqjPYBomLaa5Yg3VGUyHpBMYvirPogWLAKhSpRonjj1I1y/4xkuMjU1YvWolHaSBlMOTAlSnsXIhBeKbsnrFii/e09ujA0mbN6NMc0qOP3IEQXQ0NWrUytBeJBKxat0qNgespUip/DwSpNdzieAWiJXY2eXL0Ldhw8YY6Fkz4s993Ln9mpDgVwzpH0CePIWoVauOrp2xsTENGjRk+aLzOqOerFCxbNEF3N29M4ybHdavWckI3054XjjH/CePEG9YRzPnGkRGvsXKygpzCwtkN2+m65N46hQVHbLOiMsp9u3bQ/nSZZjYaykju82kQpmyXL4c9E1jrVuzBndXD55uyk3c7spM6r8Anw6dUKvVKJVKOnd2Z+y4fiRrr3Pj1m5q1XL4Jtn03/jn8Uu56TZv3szUqSmZRRYWFhw+fDjT1NonT57Qpk0b3Q5u1apV1K1b96vv908kMHg0b0TV4BtMVakQAW+A+kZGjFy6+ovU/6P+GoDEfxvLlEodZeg8oZDDTlXZnklFfk7cEv169uX+0SSaypdjTG6ec5Z9hh3YsnMzVap8ufgxLd68eU2dqnUYrHiLMM0+6TXXOJXfl0s3L/HkyWNatmxIuw4VqF23KI8eRLJ80UW6du2H/9JjdE64mm7MJwTyqPx0Dp7IaBg1Gg1Hjhxi7py5PHj2APMqVRAkJEDEW/w2badCBYcs5/vkyWOaNXbBUTqQPzSuRHGPs4ajGD11ON6dOmXaJzExkSVL5nHw0B4EAgGtWrajX78/MyRfREdH09G7DfHxUZQsZcu1K89wdq7H7NnL0NfXZ/WalazdtomE2Fjq1K7LmGGjMiWwlclkVCpdhItJSek0kAZKJGh8uzNh6iwCAnYydNJYzIcNQ79UKaQXLpCwfDn7d+77bo7AFy+eU792PbzkJ8hLimjeEwI5YNyR4Du3v4qQNSbmPZUrONBVcQMrigCgRskmoxqMXzyQmJgYdu5eysoNnkgkKe7Ni+eeMGXcSa5dC/1hlDy/3XQ/B7/UyWjbtm26f3fr1u2LNR7FihWjTZtU6ePt2/89uvrssGjdFs6ULI29oRHOpmaU1tfHre/ALDVoho2dyLl8+alvbMJ0oI2REfPMLZi2cOk3zSE6OprDRw7SQr4BE/IgQIA9ztSUjWP5wi+fSj6HRKKHWqtEQ/qK9WSSdKSUxYr9waFDp5HFF2bWlMvcuKxhzZrtuLm5E6N8wadzoopkQgngOssQGwoydRsO7jeIcf1mUSS0Lw1k0+DSM8oaWnH7+p1sDdGnuRwOPIJVywccs/Mk0mkdi9bO/aIhAjAxMWHkyPFcOB/M+XM3GTp0dKZZgLly5eLokXMsmL+BZk174+beiZMXLmNfxI7iFUoya8NqBBMnYLVtK5fy5qaJaxMiIyMzjPP48UPshMIM6rDtlEqunjkFgJubO2sXLKPAgUPIBwzEIfQBB3cf/CFktbt27qCs2ktniACK0Zj8VOXo0UNfNdbFixcoJKmhM0QAIiSUlXblyP5ADh/ejZdPJZ0hAqhZpxgGhkLu3An57mf5jZ+LXyab7tmzZzx9+lT3/2mNTWZo06YN/v7+AAQFBZGUlJRpDOFnQKvVcuPGNZ4/f0aZMuUoVar0F9vmyZOH/acuEBp6j3fvIilfvgL6+gZs3LiWG2fPkKdgIbw6d8XePvUFtrKy5tj5qxw6tJ/QO7epXaQo89q0/Way0IiIN1jq5cdAkb7INQ8VufpsQ47HsbGxoXw5By7fmkctdYqapwoFlwyn0rFTalaXvX0R5sxZlKF/hYoVOXljCI7KAeykPoX5QH2knAwxoK1LfTbvPqj7DoODb3Di8Bl6yu6h91FbtnJyT1bdLMPdu7dzTItUrNgfLF31Y6l/PkEgEFC1ajUuXr6I3/kzWK1ZQ+7ixUkKCuLNsGFokpLQK1gQ64EDiY6KYt3GtYwaPjrdGLly2fAmWYkcSCt0/gQwTxPjqVevQQZl2B+B+LgEDJQ2Ga4bqXOTkPB1pwsjI0PkgozxPYXwAzamRsQkilCp1On+lkJyqkYk+mWWuv9Z/DInoytXruj+bW9vj41NxhckLcqVK6cLFisUCm7duvVT5/cJHz7E0KhFYzr078nkw/tp1r4V3t18UCgUWfYrXboMzs71EQqFNK9XgzMTxtDw4D4kq5fTzLkGZz7ugj9BX18fNzd3xk6YQqdOXb6LtdrevghxytfE8jLd9aeiozg4lf+qsZasWswT241sNKnKIcOuLDMsxh+1Leje48s1L5+weuMqTGo8Z5OgDL15zWWkLAXuyeXkvXeXRX/P0rU9e/Y0JZLb6gwRgB7GlEhul+Gz+rfw6tVLrly5xJLlS7CeNw+DEiUQCASY1KxJnjFjiF69WtdWr3ZtrmWy+7ezy0fVatX5U0+PTzJ9ocAoRFy4fpsJ48fy9OmTbBNONBoNgYFHGDv8T2ZNn8zTp2E5eob6Devz0MiPFHOYAinveaA9QN269bLomRG1azsTJ3rGQ1JdrnG84qb+cjw6etCmtSeb111HLk89WQceCUUo0KdMmbKZDfkb/yH8MtuFsLDUl6dMmTLZtheLxRQvXlxnhMLCwqhZ89v5zHKKIWOG87ZkCewmbE2pF0lO5kbffixYPJ8RQ0dm23/F4gVUfvOaDcnJKfEgpZJGSiV9BvQmKOTBT6FaMTExoe+AAWxZ2hxn6Rys+YP7gl2EGK5k5qCvY4UuUKAgl65f5vTpE9y9e4f+JebQtGmzHCmOWlpasXL9SsoWL8TwNIloImC0QkG7ndsZNX4yAGZm5kglTyD9RhqZ3lvMzLJ30f1MxMZ+oHfX3ly7dg1zsS1SjRR9e/t0bYwcHIicPl33/6p79yj2hULThWs20q9LR2wunicPxrxHQBl68FDiz85d69gdsAnbvPnp2WMAYrEYBwfHdCdplUpFd692vL52hY5JSUSIJbRYsZSZi5fTspVbpvf8hDp1nHGsU4bN52pSQdobFTJuGi2hc+fOX2Sp+BL09PTYvH0L3p4duaYuhhHWhCnPMGLEKBwdnXBwcOT8+VO0bLySeg3+4M3rBO7efsPWrQH/CYqh38gav4wxev78ue7fefPmrPDSNk2667Nnz370lDJAoVAQeOgA9hcv6hZfgZ4eZn8OZuvAQTkyRqcO7mPpJ0P0EY0AZUI8z56FUbRo1nLk34q/hg4hX4G8rFo8jqjoSKpUrcaBsYe+esEBePz4EbNmTeLNm3BEYhHTZ1iycMGqHDE3aDQaBAj4PFQtAVRpUoBbtXJj+uTpPOcchUnJZHvOOR5zhNatc0af87PQr2d/kq4UZpByD0KFmNkGdsgfPsSgRGrkJ+nyZfSKFEGr0ZBw/DgJ27bR8+DxTMczN7egefsOvL5hTm35VPQwYZ2+I3OXtqBmnWJotVr8t91g2IhBmNauR8LoYbRu0Zr5s+chFArZu3c3MVevcE2alJKFqVLio1LSYFBfGjZqmmW6uUAgYNX6VRw+fIADuw9joCdmsdecrz4VfYKjoxMh9+5y9uwpkpKSqFVrPrk+Ms8LhUKWLFlDSEgwQUEXqV7FmnVrWv5j7vXf+D78MsYoNk0tyacfb3ZI68qLi8taV/5HQKlUotFoEX72covMzJDLcqbIaWRsTMzn4wJStRojo4wvZXj4K+Lj4ylevMR38dMJBAI8PTvi6fl9KpwymQwPj5b06l8Ft/ZuCAQCjh2+h7d3Wy5eDM6WWcDMzBzH8hVYGXyDgR9dT1rgbz09mqXZxVtbW7Nmw1p6d3PHgpRTRyzPWLt2XY7JS38GIiMjuXTpAgOV4YhJSdpwTh7Lme79yDN3GgalS5N47hxRU6ZAcjJhDg7kzV8Ap9KONGvcBJFaibWpIY7Va9B94F+UK5fiJlWpVOgLzbGlAucF02nqWopadVM2JgKBgA7eTuw5+ICENq2xmj2Lo1264LhlIz4+vgTu3kHvT4boIyoCpUUiLl8Oon79hlk+k0gkwtW1Na6uPyaDS09PL0vOtwoVHHKUgPIb/y38MsZImkZeOa1ccFZI2076DfLMX5uuaWNjSgWnykTs3YuFeyo1TPz27bRo0QIbm+zjOl0HDWTK4MHUSUrCjJSFeJZIRMWKFSlfPnVn/ebNGzq07UzIrRCMJVaoxIksXbWQdu3afnFu/wS2bz9IseLWtPNMTSBo2rwsZ06GERh4gP79+2c7xqptW2hYsyZn5XIqJiURaGKCNF8+TsyZiaVl6nO4u7eiVSsXzp9PqUOpVatWjn8bSqUSlUqVIz68ly9fEhgYiKmpKS1atMhypx4Z+QIzvdzoKVI3JFU1/Ul885ZrffohUCspXaECGwMCqFGjBm/evKF2tfokPSqCVnOJzshpJovj+r4API8fZcuePTRu3BhPz7ZMHDOBDzxDKn6Nwx8ZdYwKF7YkOCoKobExJn37smXdOoYMGYiZhVmmycJSwNbWCiMjIS9evCB//vyYmX2bPtLnCA8PZ86cmZw/fxZbW1v69RtM8+bNs+/4D+Gfeh9+JfwyxihtAkBOxdTSctN9CzPBt9QZzZ40gzYebVCHhCAsVw71xYuobt7EyLU1GzZspVkz1yzjJy1c3bl05jxFdvlTVyLhoRYEuXOzZeUGXW2EVqvFpUFrrB43YYD6EGK5Hq+4THefVlhb59UxJ0dFRXHyZCCWliZUq1b3H9Egevz4OYUKZ7xPIXtzHj9+mqP6DisrO85du82ePbt59fwZXSpUxMWlBSqVONP+5cunqHAGBBxg63o/khKkuLRpRIcO3unISwESEuKZOGIIAfv2oNKoqVSqDJPmLaJixcwLRGfPm83SFUsxc66LNjaWHv36sXX9VqpVq5Fpe0vLvMj5QAS3dOnQAgRoxIn07uTLmPETdW0TE1Vs3LAdu8S6qDQRDCORP4AzQHFghVTKnz16cvrabSQSU8aMH8f0yVWxTXbiUEAoPl2r6WIpUmkyF84+IVfXlE2AyNyc+PgEoqISaObekbFHjuAhlfLpzLgPeKenx4Hd+2jT1AUbsYhIpZKOHX0YO3XWd52yIyLe0LRpHZo2L87QMVV59fIDffp2pW+foXTr1vubx/1R+C/XGf0v45cpem3evDlPnqRQ9U+cOJEOHTpk22fOnDmsWbMGgHr16rEii0r+zPCtRa+RkW/ZvHUTD5+Gcer4UdRqBRJTExIT5BjpGXD66MlsWZFfvHjOzZvXyZvXjqpVq6czYLdv38KrpS+9pY/SFZeeE02hgMcr5iz4m61bNzJh4ihq1CyGSq3h2uVnLFiwnObNW37182i1Wg4e3Me29TuQSWU0d2uCd6fOmZ4qrl27Qp++Hdl3tCcSvZQFTa3W4OW2gVEj59C4sYuu7bt371Ao5OTPXyBHCQ5ZYda0GWxdvRsn6VAMsOSO4WpMS0jZc3Bvuk1Jh5ZNKXDzOrOSk7EEtgFDjY0JPH+V/PnTE6RevhxEx77dybt7t05RN/H8eeKGDePuzdAvnsL8tm9j4sgpVJeNxpqSPJLs5rnZAW7cvoxEkn5H3s27O+LAFpyiH3YkkBuoB1wBHgKRYjHBoWFYWFgCKYW6u3ftZNfuLdgXNaWDjyNymZKly4OILelErhlz0Gq1RI8ciWf+wowbPR6tVsvMyePYtGYVLkIhb0VC7ghFtPXqxJVN69gjlVIAiAQ8DQ1x6tWPYaPH860YN34EUkUII8Y21l17/iyaTu6bCQ5++M2USD8K/2VjdF0ThYKsWVT0EVJZmHU28b+BX+ZklPYHnF2adGbt/skXIE8eW4b+NZy6zlUx0NfQf1BDrKyM8N91h+A772jp1opb17NONS9UqHCGiny5XM6xY4c5d+4MRlgjIP0CbqUuzpvw6zx9GsaUKWPYvtuXQvYpe+HQu2/o4dOHatVqfnVMZdzosRzafpoq0hHYYMrm+yvYu2s/ew/ty3BKrVy5CuXKVqZPN398e1RFLBayZcN1LC3y06BByuIUlT2e2AAAIABJREFUHv6KXoP7cickBJGeHrmsrVk8ewHVqlX/qnl9wtu3EaxcsYLeigeYkBuAUjI3tj1yZt++ANzdPVM+g9B7PAgJ5mhysu7F6QwEK5VsXrdal6n3Cdt2+WPs7a0zRAAmtWsjs7fnwoWzuuf5HJ4dvChUuBCrl67l7uvt1KhbldV9TmFnZ6dbBGUyGQvnzuTS+QMo2IsQDfWBxaD7VicD89Rqbt68wbwZC7j3IAQxBiQpY8hlZYdEVIg1y0JRKpU8D4vBorIFH/z8UJ08hUlEBAM+yn0LBAJGTZiKV5funD9/FnNzc9Y2bELDqhXZ9NEQAeQBVslk1FizgqGjxn3zBuH6tSAGDkt/0ixsn4vcecwIC3v8Q4px/79ip+Y578l6fbNG/7cx+jdhnkZaNKeCbGnbmf/D0qRRUVE8DXvM0TODsMmdsht2blAC365+XL/4hKioSGxsci5S9+jRQ1p7tEFgb4/AvjAxRk/ZommFl3w3oo+h6UeGu2hbvxp79+6mmWsZnSECKF3Wjpq1i3H48AE6deqS4/s+f/4Mv63b6SN/jCEp7rfiMle2PK7NoUP7ad06fYxKIBCwatVmNmxYy9rlfqjUalo096Rbt16IRCLUajVtOrRF0bwZhVcsR6CnR0JgIF5dOnDxdNA3SWBcunSRIhJnTBS5ddeECCkp7cjpwHM6Y/Ts2VMcxBLEuoqdFFRJTmbX/dAM48oVCsjk9CcwNEQuz3rByE4avYeXO0bXr3JKIccUqAAMg3Tbiz+BKVotvbr0pqF8IXVpwGuucZh+lIz25fHFQ7Tq1pAx48by4sVzNm/bzMs7odR0caVdO48Msa3PNzhvP8RkYHYoCsRKpSiVym+WYMljm5fnz97j6JR6+pfJkol8G4uNTe4sev7G/zJ+meR7+zR1GhERmQk4Z0Tadvaf1Xn8bFy/fpXS5ex0hghSFmq3lqUxMhTz/v3nOXOpUKlUnDlzigMH9upYi7v174len97YbNxArokTKXbuHBElw9lPT55zjgN6viRY38W7kw8KhRxDo4xxNUNjCQrF18XOLl8Oopiwkc4QQcpCXyLJk3MnL2TaRyKR0KNHbw4ePMPRI+fp338whoaGKBQKxo4ZwTuVCqt+/RDq6yMQCDBr0gTjZs3Ysm1LjuaUlJRESEgwbz6yUltYWBJPeIZ2CaJXWOdOzd4rVao0V5TJn5kiOKlvQKnKThn6t2raHMWOnWjSnLAVT56QcOsWtWvXydA+pwgJCeZh8HV2KuSUAwoDhmQomdI5axrI51MOT4yxoTjNcGMrIWyijXQ3a1evJjExkUKFCjN21DgWzpqHRCJh4sRRLFo0j3fv3n1xHpXLVWDvZ9cOAmUK23+XFlhX376sWHyRRw9T6I2k0mRmTTlOzZq1vlsP6zf+u/hlTkZpdYlCQzPuYj+HSqXi0aNU3Zjv0TX6FlhZWfMuMgGtVpvO3REeHotGK6J48c/3pCm4e/cOHj6eaHLlQpzLmri/BtCtczdevQ6nUPv2unZCfX1yDRrI0xGj0JiH0rBZPXr3PYqpqRlNmzbHt+sGfHtWx8wsZWcf9S6BU4H3GTk0exnluLhY1Go1VlbWWFtbEyd8kaFNguQ5JWxz7u7TaDR4uXvx+MZrDOplpEcSFCvGy6cZ7/M5Vi5fzuyZs7AQ5yc2+TXVqtdg8YrFKI2iuZm0BgdtNwQIiOAWwZJVTOl0UNe3SJGiODdoTJuTx5khl5EbWCsUctTQkBOZqMK6uDRn5/4Aglq3Rq91a/jwgcTdu5k5dRZmZt9+0r579w51Sf/yugNTgbWkno5misUYaaCoJr07sADVSeANBlhgIs7FmzevKV68BDEx72nVujEikYy8+Ux49vISy5cvYOvWAD58iOHWrWDy5cuPq2trjI2NGT5lBt5urryXy6iv1XIZmGhgyOLpc7752SClUHbE8En06jweUzN93kcnULeuMwsXLs++82/8z+KXMUZVq6YyRz979ozo6Ogs643u3bunS+fW19enYsWKX2z7M+DkVAWJyIRN6y7RyTcl6+nhg7dsXBNEZ+/umVaUq9VqvHw7ojfkL8xbpiQamL19ywY3NxAKU/5LA4FEgl3+fJw8eiLddQcHR1xd29G+5TratCuHSqUhYEcIffsOzpQZ+hNevnzB8L49uBp8A6FAQJniJZm2aDlSw9fpFvqXBHFbvIm/vU58cazPcerUcZ7feUdr5XbWX2qMRi5H+DHTTavVojp1ihptPbMc49ixIyyeuQpf2VWsKIoSGceDBvFn/z/x2+1P5w6dufZhDoZCC95rnjL779mULFkq3RjzV65jyYK5uG1cS4JUSn3n+uydMDXT35JQKGTd8rWcOXOKYycDMTOxoP2BwO+Wqba3L8JqgQAt6eNDZQUCKkokNNJouGJgQJSFJbZiS948v8YfpCZ+RBGKARYoiCdRFYWdXYprc+q08bx/8YLiQij1OIITYhE2uYzp2LoZBURimkqTCDQyYtaEMew4GIijoxPTFyxh9MD+TE9WIhIaoRAIkcm+TxMLwMvLh3btPHn6NAwrK2ty5/7tnvv/jl8mmw7AxcVFR5Y6bNgwunfv/sW2EydO1LF1Ozs7s3Llyq++3/dKSDx79hQfn3a8j4nE1NSAiIg4uvr2YuLEaZm2v3TpIr6jhmJ7YH/6eaxbR9KqVVhMmICZS8qipNVoeNe3L72q1mTwR4XRtNBqtVy5cplDh/diZmpE48YtsywkTE5Opq5TObpFRvKnRoMIWCsQMNnMnHV+AfTv2Y8PUQnoCYxIFsexcNkimjRx+eJ4n2PyxAncW2ZFXcayy8CHF8UeYTmsL0ITE+I3b8by8RNOHT6ZZd1P2xbtyH21C+VIzaRMJomFevm5GnyDXLlycfv2LZKSknBwcMxRDdE/iU9ZXFqtFpc6VakdFsZElRJDUj7rSSYmTJ6zkPDwVxQtWozGjZty5MhBRg2YSEvZNvJTlShC2YMP9jQk0jCIxt6VGTdpPJcuXaRHBzcGqlRM+PibVQNtRQIeqrXcI9Wnv0QgYHvZ8vgdOk6l8hVwjl1AGdwRIOA11/AzcOHkuVMULvzPurb/KfyXs+lGqK7lKIFhljijW/nfxi9zMgLw8vLS6RmtXbsWNzc3rDIRoQsLCyMgICBdv38D9vZFOHfuBvfvhxIfH0/Fig7p6l6ePn3CvFnzuXr5Gra2tlR3dkJskdH9I7KwoHTJUjyYOJHkkyfR2tujPnmSwsam9Oyeed2GQCCgWrXqVKtWPUcvX2DgUfIlJDAqjThfb62Wk8pkDh7cC8pYzASxqLXRmJvlyjEl0yfY5LEhXu8hN5PXopE/xuJuBDE9xpGsJ8W5TjWW7j2crfGIeveOEmnkByCFHNVUkouYmPfY2Nj8T1TuCwQCtu49wti/+pPvRCAajZYqFSqwc/7SDAzvLVu2ISlJyuypXkTFvEWgFaHUyFGYvqZn717Ub1Qfx/IVkcisSUhWMixNXxEwUa2lDemDy720WsY+vE9AwC6sVaUoS6r7Nx9OlFd7s8PPj+EjR/3Mj+E3/p/hlzJGHh4erF+/ntevXxMTE0PPnj1ZunQpefKkZqWFhYXRu3dvXVq3k5PTNwnr/SgIBAJKl85I7Pr0aRgujVxwSOqLi2YY0REP2Xx/OPGid5g+e6Yj1tSq1ch37cK7YxcaN27Krl07ePM2gmpDRtGoUZPvEhyLi4slIiKCAgUKEh7+kvKZyElXlEqZsXI5W1RKWn285vc6nI5urly6dT/H4mpubu78PakMAvyYggIxMDtZj7tqWLl0dY74x2o6V+fBlp3kV6W6bN8SQrIoIR0x6L+FyMhI1q9fyY0bl8mfvyC+vr0pXz5z97C1tTXLN25HoVCgVqsxMjIiPPwVY0eN5tqlYArZF6BX/x44OjrRoUNHPD29SEpK1FFCCYVCVCoVlcpVoNb7ORTDhflYIv6sRkUPUGVyf4D4+FhM1BkVbY2U+Yl5nzNW738DWq2WuLhYjI1NclwA/xs/H79MNh2kMCosXrxYt4O+c+cODRs2pGfPnowZM4YuXbrQokULXr5MkUKwsbFhzpzvC8Zmh5CQYHp07oFz9Xr079WPBw/u56jfor8XUVHaizqa8eShHGVoh4f8ECK1iLcdOhCzeDEftm3jnVdH/jAwxM3NHSsra3r27MPE8ZNp2rQZIpEIpVJJQMBOeg7sw8ixI7h7906291YqlYwcOZhKjqXo4tuGihWL8+DBPY5LJOkyurTAfj09HIQCWpMS3xAAHYAqahWHDu3PbPhM8fr1KywkAs6jwA1oCZwmGTs9EdeuXcmuOwADBg/kkakfgZJBPOcs11nJDsMWTJgyMUfZX1qtli2bN1CvcjlKFrbFu3Uzbt26mW2/nOD163CaNKnF68jzeHQqSJ58UXh4tuTo0cNZ9tPX18fIyIhnz57SyLkBoRv1KR86BcXhanRw66iTfhcIBJiYmCIUCnXxxgsXzmGoyEtZPDDAjEI4kNYZrQVmASZCYToTtUIgoGzJ0jRu7MIjzRFkfND9TY2Kh8bbqVv/39vAZYU9e3ZRpWoZKlUqSZky9syYMQmV6kvm9jf+SfxSJyNIkY9Ys2YNw4YN482bNyQnJ3P27NkM7YoXL878+fO/2p30NTh37gzdOnWjunw01bWDefHsNK7HmrNjz85sxd2uXblOPXW/dNdsKIW5KDczZk/kbNAFYiPu07R7b1xdW2e6A0xOTqZtx3Y8TkpEv1UrNNHR+Hu0ZtrYSXh18P7ivWfOnMSjJ0EcOdUPC0sjIt7EMrDXLsQ2uWmnimC0Qo4eME9PjwgTE7xjMqahF1Eoskwb/hyXLgXRWqNJJxAnAdrJZFy+dAFn5/rZjmFnl48TZ0+xdPFSrpwfRd58tqztv5KaNWvnaA6L/57N/iXzWSKVUgrYF3SBDq2asevwie/Wy1mwcDYursX5c3iKwF2desUpW8GOsaOGcPXGNQ6fDMTMzJRObT3p2NEnQwLL3zP/pnxiL+pqJgJgr61HHllFxo7oiotL80wTXhISEjAmtfixEZuZSC0CSaAGSg4ZGBBrmxcLU1McnobhIpNxx9CI2/r67FixliJFiuLl7cXm7bWoLP0LCcaEGC3HvkIuGjfOPuvyW6HVarl16yYRERFUrOiAnV3G01lmOHXqBBMmDmX2glY4OBbkdXgsE0btZ8YMJePG/btM7b/xiyUwpEViYiIBAQEcPXqUly9fEhsbi5WVFcWKFaNZs2a0bNnyu2olIPsEhno161H28RhKkao6e4PVxFbZye6Du7Mcu31rDyyCPKmIj+6ajFiW6Bfm5u2QbNmtAbZv38Kk7ZvIs2kTgo/uOkVYGBHu7bkbfE8nuJc2ZqRSqShdujA79nfFLl9q7dC1K8+ZOfkCLV3acMB/Gyq1mqat3KhcoyZz+vUkOCmV9VkBlDIyYumu/VSuXCXbeQL4+28jcORQ9iclprvubWBImfGT6P6F2Ne3Ij4+jufPn5EvXwGsra2RyWRULGnPDZmUtGH5OQIBV11asGzD1u+6X42aFZi1oAklSqbKlmi1Wmo6zkZcwxmzbt1Qx8aSuHQpLuUrsWDO/HT9K5VxoFXUAWxIzf7TomWBgS1nL5/NdMF+//49lStWpIciBAtSCkylxLBO4kRl5z9wc/ekWTNXxGIxZ86c4tatm+TPX4AWLVrpGEm0Wi3Hjh3Bf9NO5HIFru1ccHf3/Gnur8jISDw6exIe8x7DosWIu34dT48OzJoyM1vGB3f3ZjRvnYdmLculjvc2Hrdmq7l9+0mOE1Z+JzD8HPxyJ6NPMDExwcfHBx8fn+wb/wQolUruP7lFW9JzvZWiLUtChmTbv8+gnvQNHkRuWVnsqISUGI7q96aZi2uODBHAgRPHMHB31xkiAP2iRTEuWZKrV69kKg0gl8uRyxXktUufKGFfxJqod1EMGzWOYaPG6a5rNBq2VqxE05vX+VMmQw3MNTSiQq26ODrm/IVo3rwlU8cMxx904fJDwFGRkLFt3L/YT6vVEhR0gePHj6Cvb4CbW3tKlCiZZfsZE8eyYf1qCkokvExOplVLN7r2H4SVUMjn+WGNtFo23P5+FWBLC0veRsSnM0ZJiQrkChWFp01D/JEBxMjJiT316jG438B02WrW1jZ8iHqWzhjJ+IBSI8fMzAyZTEZExBvy5LHVxdesra0ZOXo082fWwlHeH0NtLu4araNU+aKs3bAtnUGpX79hpr8HgUBA06bNaNq02Xd/BjlB78F9eV+1Cvn++guBUIhFfDx7O3em4vYteHl1yrLvixfPKVU2fQwuj60ZBoYSYmLeky9f/p859d/IBr9UzOi/BLFYjImhBbE8T3c9hsdYW2RP81OvXgPGzxxFgHkLFhsVZKl+EUq3MGLuwr9zPAcTI2M0aXSePkEVF5ep9hGAsbExhQoXIOh8+gD1yeMPcMyEhUAoFLLefw+Nxk1mdvmKzK9YidaTp7Nsw9av4i4zMTFhy+4DjLfLR1EjY0oYGzMwdx7Wbw/4IleeVqtl6ND+/PlXN4R69wh9eJQmjWrR1debyMjITPusW72CixvWcl8uJyQhgWcKBe8O7GXr+tVEq5R87li8BtgXLZbj5/gSfHx6svjvc0RHp5z8lMkqZk0LxLBUKZ0hAhCZmGBWtRrBwTfS9e/R35ezRiOIJ4VVIhkpx/UH0szFlXUrluFQyh7PBrVwKGXP1HGjUH8UGuzVpw+bd60nT/vHCFxOMHSuL367/b54snn9OpwNG9aybdtmYmLef/dzfw3evXvHjWtXsRwwAMFHt6PIzAzTgQNZuz179o2yZctz+eLTdNfCHr9Do4bcuXNOrfUbPwe/7Mno34ZAIMC3a1eOrO1Na5kfRliTwFtOGA6ke5+M1fyZoUOHjri7exAe/gorK6svVvUnJiayds1qDu8NxMjIEC/f9rRr54GPhxcnB/bB1MUFyceMwrh9+zCQy3Byyug+U6vVnD17iurV6jJq6E76DqpN2XJ2XA56xqa119ix40CGPtHR0ezZs5N37yLpN3oczs4NvlkCukIFB84Hh3L/fihqtZoyZcpmOda5c2e4cPEE23b5MHbATiJvvWaEPJnHh/ZT99RxVm7yy6A4umHZItbJpHw6n1gAy+UyKvpvw8PDC6+dfqyWySgMHAfGGRqyesiIb3qetGjfvgNPnz2mZeMV/FE8Ly+eR2FhaYVelfT8dFqtluSnYRk4+NzdPXnx9BXLl5XFWlKE98nPqVu3HhUdK7Nz5hSuS1Pci28Az03rWWBszJCRYwFwcqqKk1NVssOylcuY9fcszBrUB4WC0RPGsGT+Ylq0aJVt3x+BpKRExMZGCD5zn4utrEhIiM+2/+DBI2nf3hWxWEidesV5/DCSWVNP8uefI35n1f0H8MvGjP4JZBczUiqVjBkxhp07/bDUy0+sMhxf3+6MmTD2mxfsz6FQKGjeqBna5wWoKO+NnDguG82gYdsqzPp7NvMXzWP+4vmYV62KKioaYVQUOzb7pwvI29iYcufOI1p5tCFOT4KkdGkSTp/GQiLA0syMsmUr0K/fkAxsBZcvX6JLl/bUdi5GvgKmnAoMwy5vUTZu3JljEbvvwahRf2Fu/RwzMwNOTjvGSZlSF7c6BfhYWnLtXlg67Z3ihfLwUCYjbb2/BjASibj38AVL589m4/q1yJIVFM5rx+jpc76qeDc7xMS85/79UOzs8iEQCKjXtB7Wc+diXKcOKJXErFyJSeAJNq/ZyOvX4ZQqVSYdO0FCQjyPHj3Ezi4fefPaUcehNKtfh1MrzT0eAbVMTLkbFp7j02lo6D2au7fELiAAyUfGBtm9e0R09ManXXtePXxA0bLl6NKzb7byJpBiVPftC8B/9QoS4uOo27wlHX268PbtW/LmtcuU8Faj0eBQzQHJpImY1Ep9oqhx43CzsmHK+CnZ3vfmzevM/XsqISEh2NnlpXevwbRt2z7bfmnxO2b0c/DbGP1E5JSB4cOHGMLDwylcuDCmpj9GKfMT/P23sXiEPx2kJ3WSEXLiWWZQlBPnTlK4sD3v3r3j0qULmJmZU7t23QzCaDY2pjRo7sq9wgWxHpISz9KqVLwbMJBO5SoyesSYDPfVaDRUrVaOYWNq4Vw/hUdPpVLT29ePli160r17rx/6nGnx9GkYL1++4NChvRhbvCD0Yhj9rr+k3WftypuYMmvHnnRJFD5urrS4cJa0eYr7gfFFinL8cjCQckKUyWQYGxtnuphLpVJ27/Ln5sXz5C1UGC8f3wxaR58jJuY9a9ev5dzVS+TLY0vPLt2oVKky586dYeDwP0mQy1DJZJQqVQaRSETog/sYFy1C/P37eHf0YdqEqZnOpVgBG54pFKSNImoAA6GQpy8ic7wpmDZjCtul8eQaPlx3Tf7wIW9dXekOOKvVBEkkbNDTw2/fkS/WR+nGmzCakxvXMV4qJRewWiTigEaLXsmSyCIiqFWrDisXLdMl0XzCqVMn6NavBybt2yMqVgzlyZPoP3xE4IHALOm9fiR+G6Ofg98xo/8ALC2tKFeufJaG6N27d5w9e5qnT7+umPDCmUv8IXVPp11kgBlFRQ24evUyALlz56ZVKzfq1WuQqUJnUlIS50+fxLJ3asaaQCzGrH8//AN2ZnrfFFeanLr1UnnYxGIR3r6V8d+xMcfzv3XrJoP6DsS9pQcL5s8jNvbDF9smJibg3aktLVzrMW/BSHbv9mf75muoNRo+L8fVAslabTr3jEajoUlbd8bp6zNJKOIiME8goJuhIWNmpsbiRCIRJiYmmS7+Hz7E4FK3GifHj6LOnl0kL1tEo1pOXLp08YvzjoqKol7TemwMe8CbDh4EFSlEO58OBATspE4dZ4Iv3eR4wCHC7t0jn10+nue1peD5c+TaupWCJ0+y68I5Nm5al+nYlcqW53Pn6TGgRIGCX3U6VSqV8Jl7LHHyZGaq1SxUq2kDzFEqmZGUxNQRWSfgREa+ZeO61ZyWSnEnRQxwq1pNTT0Jeu3dKXThPLf0xQwanpGmqn79hhw/EIgrIsqev0j/arU5G3gmx4ZIoVAQHHzjq9+j3/j5+B0z+o9Do9EwZuIYtm7fgpF9ERKfPKZY0WLs2r6LXLmyJ4/Ma5eba+LHGcroYwRPyJ07e7VbQBfsFnzmVxcaGKQsUplAJBIhz4QwU6XUEPE6ZxIee/cGMHzQSKoo/sRW04qjwbvYsqEBx04dzzRpYcyYIRiZxHD8XH8kemLi4mR4tl7D1XuRxIiEtFJr+JSWsRtQmpjohNoePXqIl7sX2gRDLMWVmau8yuZcVlSqWo3tg4fmmCZo6YK5VIt4w9rk5BTzn5xMg+RkRvTrwdkb9zI1YEuWL0ZVsyY2k1PF+QydnBjZO7VGrEiRohgYQODRQxQ+f173XYgtLTEbOoQ18+bTJRPm8GGTp+PTriVxcjn1tVquAGMMDfl72qwcPc8nNHdpzuZevqi7dkVklrJp+nD9Op/nonoDvW5eR6PRfNHVfOPGdWro6ZErjbSGAOioUHD73DmEPj5YjRtHYO3axMXFZpC7L1bsD6ZPmv5V8wfYudOfURNGIc5lgyImhj+KFGXDirU5rlP6jZ+L3yej/zg2bFzL7ksXMWvhQvLLMOo3KYFI9IEqVctz505Itv29OnlzR7KZZ5wBQIOaK8IFYBpP7do5q5I3MzOjrIMjcbt26a5ptVri1q+nUvkK3Py4+KRFiRIlSZIqOLg3ldFBoVCydvF1oqJiyM47rFQqGTV0JO6y/dTQDKcUrWmp2ILt+3osW7I0Q3uZTMb+/fsYOqqBTq7c3NyQyTNdKVAgPxYVKlFUokdfPT2aG5vQ38yMFZv9EAqFaDQavD28qfh2GN0SQ/BJukAPTRixSYZ49+z7VXx1Jw/up/cnQ/QRrsCH6Pe8evUy8z4Xz2HcMn2Kv2H58mBszJMnj3XXEhMTEUokCE3Tu64ktrbEfshc38rJqSr+B45xumET2uW1Y3ftuqz235NOvj0ncHKqSnvX1rxp0YLo+fOJnjEDiVrNm8/avQXMDQ2zjEXlzp2bMI2Gz38BD4RCtB/jUSJTUyQmJsRmku35Lbh16ybDJ44h1/r12B46SMHz53hbrQodfDtm+1v8jX8Gv09G/3Gs3rIRSf16GBzdxb5TfTE1TeEgOLjvNt27d+TSpdtZJjsULmzPynUrGNzPB6HCELkmkQKF8uG/YcdX8dItmDGXVu1bobp+HUGZMsj27CH5eRgRf9jRr783Wo2ENWu2UbZsSkGhQCDAUGzJjDFn2O//kEJFzTgV+ASrpEpYm0uzDZw/fvwIPY0Z+Ujv2y6T3InTx4YwbkL69jKZFIFQgJm5QbrreWzNkEql7AkK4e7dOwQFnaeclTVLXVro6m1u3rxOcqwIB20qi7s5BXCS/8mW9VuzVFz9HEZGRny+fCYDCo0aA4PMiyqtLCx59Zngo0ahQBHzAQuL1FOBra0tuXLZkHTuHCZp+BIT9u7FubbzF+dUvnxFVm3d8cW/v3//Hj//rTx4GkaFUmXwaO+Zqct4xqTpuLdy4+Dhg+hZmPDBy4chu3ewSy7DCJADfxoY4OXVKcvv19HRCb08eZn64hkj1WokQBCwWE8PG+8U5g/pzZsYiMTZxtpyirWbN2Dq2wWD0ilEsgKxGMt+/XgdsIe7d2//ljL/D+C3MfqPIy42Fm5do2fXyjpDBNC8ZTlWLrlESEhwttRBDRo05ta929y/H4qRkRFFiny9UGCpUqW5ev4qO3b4EXznFsffvGTDts6ULZ8PrVbLof138PZ24+rVezrmin4D+rPp7wNYXutMzDU5jSjNJcOp9OidffKChYUFScoYVCgQkxrbiOc1llaWGdpbWlpRoEB+zp56RL2GqUWtB/beplatlIW7bNlyOmOZFgkJCRgLc/0fe2cdFtXWxeF36AZBBBUQBLunOtAWAAAgAElEQVQDxbgmtmBhYrcodnfrNa/6mdiC3a3YjcU1sEUMBKSlB2bm+4PryAhKCIJy3ufxeWb27L3POjNy1tn7rPVbCs/VALRlJkSEpx8ynBKnPgOYPWsadeJi0Sb52dRCZWWqVq763Zo8A3v0YdS8mWjZ2qJqaoosKYnwpcuoWq26QlSZSCRiydy/6evSH3HPnqiWLk3C5ctILl5iwvGzmbLzCy9fvqBV+1ao1amDUqVKXLhynhVrV3H6yKk0k0CrVq1O1arVgWQ5qTGfI7A4e5oq6uo8EIupW78hE34Q1SaTyVi5ZiVvIsJYLJOxBDBUUyM4MRGVOnWQhIURvmMHUWvWsmzuwp8S8k1JQHAwKjUU/05ESkpomJsRHJxxWaq8TkclSxK+Ebv9FvU8uiEmOKM8Tr269bh47zqaWor72iKRCC1tdRISUitlp4WysnKaF+LMYGBQgIEDhzB//iw6dKpK+YpF5ba0blOR/bsfcfHieXmo81BXV8JCwtm2bQp6KqZ8TgqkZ48+DB85It1jFSlSlIqVKnP5/nQaJs1HCWWiCOCG1mzmDU4dvScSiZg7ZykDB3bn2dNPlC5TiOtX/bh47jXHj6384bGqV7clMPERobzEiBIASJHyWHML/Vu3ztR31LNXXx7d8aL4iaM0UFbmqUiEzLgQ7hu2IBaLWbzwb3a6exAd+5m6tRoyc/4MWrd25NmrF6xq2RKdkiWJe/+e0jYl2bB+C4GBAaioqMof0Dds2JgdbtuZOXUCIW4bMTUtzPjF/2BubpEpO78wZuoENAcOpEDv3skN3bsTsnQpM+fPxm31hh+OVVNTY9WmHbx//46XL59TvLhNujWM1q5fw+r9uzHZtQt1Gxs+nz9P8KxZjBvggn9QADdXrsK8SFGGbnanRo30c58ySqNadXh68iS0/KoUkRgYSNTjx+nezP1OTPoQx8d0hF+LqKjgmbX/LjmKENqdg/xscT1Irp5ar1FdbEoYsH1nT1RUku8U/73/nlFDD+N9/3mmNPS+LWOeEb4NZR03bjim5oH06GOn0G/CyKM0azKALl2cFdqjoj7z4cMHzMzMMhW6/unTJ3p368WbV+8xUrbCX/wAl6HDGDth3HfP4cWL52zevJa373ypVLE6ffoMUigR8j22b9vKvOkLqJbgio60CE+0tqNrE8+h44cVakhllNevX+LtfZ8iRYpiZ1cbJSUl+vfqz6uLMTSMX4w2JjwQbeGO7mIuX7+KiYkpERHhPH78CBMTU6Kjoxg2biQf3r9DKpFQuUo19m7fSnh4LK0b1aVNVBRtEsU8FYlYoKHB7OWradv+2+D1HyMWiylmVZgSDx6glCKyLjEoiI8tW/HmRfpl3DODTCajdKXSFNjohkaZrzlpMTduoLTgb7wu3cjW46XE1/cVLR2akJCYgLKeLqLylZE+fYZL1x6MGTk2U3Pl5dDuJu/eZdAZ5T1vJDijHCQ7nBHAhw/v6dipNYhiadO+IoEB0Zw65sPKlW4ZTri8cOEcCxZO5+EDHwoXLsTAgUMZPHh4hpJrv/3jO3bsMCtXzWD73h4oKyePj4yIpbX9Wjw9b2Qo6TEzPH36hKCgQCpVqpxh3b2s4O19D/et7oSFRNKkVUPat++YJUeUFr6+r2naoCmu8W9R5euzo9PqLtQarMekKV9Xe8HBwdjVq4He1KnotW6NLDGRiE2bUD9+HHtbOwx2e7AkxQXHC+iQRgJvekgkEooVL4Ll1auoFPi69Zng60tYj548f/j85076G8RiMRaWppR69kzhZkISFcXbunV55/ttOET2EBX1mcb2tanXwAynrlWI+hzPskXn0VArwqGDpzM9X352RmKxmGfPnvHo0SMePHjAw4cP8fPzkweBDBs2DFdX1yzNLWzT/QaYmZlz7ep9zp49zbVrFzEvXBBPzw0ZvuifOnWc4SMGMGehA/UatuPVy2DmTN1MdEw048dNzbQ9LVq0Ztt2Nwb13o1Tl4rExIjZtvEO3bv3yXZHBMnPq76tYJoTVKlSLce2bF6+fIG5anVU4xWDGMwSGuDz706Ftj17d6LZqBH6/0XYidTVMXRx4dOFC1w6c5Ld31xsagIqCWLevfOjePGvOnnv379j0cypXLp0AR0tLTr36svQEWPkuVXKysq0btOeq8uXU3DWLEQiEbKkJCKXL6eTU+ZUCTKCmpoaRayKE+vlhbbd11V1zLVrlCz3c1vIUqmUK1cu8ejRQywtrWjWrIV8x2DPnl2ULGXA+KlN5f03bHWmef3VvHjxnJIlS/3UsfMLhw8fZtq0aYjTKKKZHeTNJ1kCqVBWVqZFi1bMm7eEMWMmZvii//79O0aMGMDoCY1p1KQ0KirKlC5jyuKVbdnoto64uLhM26KiooKH+0E6tHPh7IkI7t2SMWvmP0ydmr4cS37F2toG/0Rvkr5Jvw1QvUmpciUU2vw+vEdUsiTfolKyJBoamny7eRYNRCQloq//dXUTGhpKmyb1KXniKF5Rn9kTFMidlcsZM6S/wtgFs+Zh+uIlAc1bEDZuHB8a21MqXsyksTlTMnzauEmEjhvH5zNnSPz0icijRwmfNYupP6HvFx0dRfM2LRg0YzLrP75lgttqatSrwYcP7wF4+PAutesp/r2oq6tSvaZVhtIjBJKJiIjIMUcEwsroj+eff/5GVU1E5aqKIbJFihqgqaVKcPCnLK1m1NXV6dWrL7169c0uU3+KoKBAXr16SfHi1mnqmuU2NjYlsLWz5djNHjRKWII2hXjANp6o72RV/4sKfWtWrc5Jj63I+vSRb2fJxGJirl1jYL9BTF2ykBqxsZiTXBtqjJoaDeo1UEgE9ti+GfvYGGb/l/9VDDgSH0exs6d488ZXXma9QAFDzh33xMvrFr6+ryg7eDiVK1fNke8gOjqK2JgYGtva8eB/qwkK/kSJ0mVYtX4LdevWy/K8fy9bxAcTY0zdt8vVvMNWrWLkxDHsd9+LhYUVz55cUhgjk8l4/jQQ88HZv5L/0ylcuDAVK1akUqVKVKpUiSVLluDt7f3T8wrO6A/n2rVL2JQoxP07b7G2+VrV88P7cOJixb+9dH5SUhKjJo7h6JFD6JQqSfSLlzRr1oJVS1b8EjHWzOC21Y3ZM2axYXd54sQx2FWtz/5FB1Ll0jg4tOWftf8jeMIEdLt3RxofT9TqNdS3s2PYsJFI4xOotHIZNqqq+CWKqVa9BqvWblSYw+eOF07xigoYmkAtVTWePPGROyNIjkS0s6uFnV2tHDv3ly9f0La1I6YJthjGVkak/QErCyv2bt3503qMB48cQm/9OrkjAjDo14+btrbExsbi7NybRo3WUaVaEZq3Kk98XCJrVl5BX79Qmur0AmnTvHlzWrVqhbGxsUJ7dimeC9t0fzgFDA35q74Nq5Zf5MxJH+LixDx68AGXfh707Tc42x7QZ4a4uDhmzZpC5co2VKhYnEmTRn+3Nk5SUhJHjhzE1bU/kyaNTlXHZ+mKpXi+fonF5UsY79pFsSuXuRocyPxFyXIxkZER+Pm9kUsapYdUKmXTpvXUb1Cd8hWsGDSop4IKQlrEx8fj4bGdPi79GT9lPD4+j9Psp6WlxcLFf+P77j3+H0M4fOpwmsmWGhoanDx0nE5FLEicMBGV+QsY2rgpB3ftAmD42Anc9XnJjF0HOHXtDtsPHk8lmVOsVBnuqipGWUoA76SkdMOvc4KRLqOwjZhEh9jDNGQmPWNuofS6BMuXLk9/cDpIpVJE3wZu/JefJJPJKFy4CB4eB9m1/RV1qi2hUe1/CA0ywMP9UKYjS/MzpqamqRxRdiJE0+Ug2RVN9zPs3LmDDW4LGeBSix1bbvH4oT/aOupYFivB6dNXMvTHmJ3RQzKZjNq1K1PETIXhYxqhpq7CVrcbPLgfxuXLdxVWM0lJSfTq1ZFPwb44dihLRHg8ez3uM2rUZPr2TU6cLVO5DPob3dAo9fUhtPjdOwLatadxk2acOX0CNV1d1EVKzJ0+m/btfhz+PGv2ZK5dO86oCQ0oUtSAk8ce47H1PmfOXE1TDSA2NpbWTg4EaGig7tAaSUAA0R4eLJ61AKdsDgLIzO/w/v07mtWryfKYGLoAEcBENTUelyjJcrdtWFvbKPz2Dx/+y/Xr1zA0NKRVK0d0dDIe3RUbG8vp0ycIDw+jVq26lC1bTuHz8PAwKpevwJjEEFT46iAD8OaUSWfuPrr37ZRAspO5ffsWISEh2NrWwMTElMDAADZt3cS/T3wobWPDgN79+d/61RyPDMN4/nz5OYVt2oTljVsc3XtYYc6wsFDU1NQzdX7fkp+j6dKiR48e3L59GxCi6QR+QNeu3fHze8X0SRsoUbIwuno6VKtWg7VrtuTKXeHkyeOIig5h1YaR8pyp2QsdcXbaxOHDB+jcuZu87/HjR/gU4su2Pd3lfVs5lqej40zatetIgQKGRIWHUbCI4jMiVVNTYhPiuZkkxvLqVZR1dYn991/GugylSOGi392OCg0NZceOrZw4N4QChslSQf0H1yUyPJ4NbquZPWthqjHu7tsI1Nej0Pr18u9Tu0kTxvfoSatWDmhqpi0BlNOYm1skV8Yd5crAl8kh2mpKShAbS9MOrSlayIRt6zdjaVmcESMGcfXaeRo2LkHA1ShmzZqEu/sBudLCj3jwwJvuHRypIpFgkZTISiUlmjq05e+Va+VpA1//nynemEmRKGytpcTP7w0de3TmswjUipoROWooHds5cfTkMTSaNUPVoSXP/n2AR7MGTBg5nvAF7sQ+eoZ2s0bEed0l4eG/7DyWOmzb0DDtqsACuY/gjH4zPn36xNy5Uzl56jjKSso4OLRl6tTZGBiklsiB5AvB5MmzGDx4OM+fP6Nw4SKZ2qaRyWTcv3+fd++CUFFRwcDAgJIlS2XJkSUlJbHNYwcO7SrIncsXG+2blubMmRMKzujcuZO0aV9Ooa+ZeQGqVrfi+vVrtG7tiG3tuvgePUoB56+JtmHu7igpKWE0ZzZK/zkDrcqV0R3qwupN677rjF6+fI61jancEX2h1l9WbHe7n+aY4xc80ejopPB9aJQujbq5GQ8eeGNnVzsT31BqIiMjePr0CYUKmWBs/OMaQd9StWp1jl++yZMnPrRs1xKDNWvQrlEDmVRKhIcH7bs5MWnUeJ4+8+LImYFoaiavWjxPP2HwkF7cuvnoh3loUqmU3h3bsupzJB3/a1sK1Dt+hCONm9Duv1WogUEBqlSy5fb9ldSWjksei4Rb6gtp36ltqnllMhm9BvUhoUN7TPv2RSQSoR8ayu4WLTDs3x+jgQOTOzZvjrKNNfMWLKJ97BZET0UEPPWmAH3wVTvJqROnKF++Yqa+M4HcQ3hm9BuRkJBAu3ZNUdd+z+FTA9l7tA/xiU/p2LFVus9EDA2NqFWrTqYckY/PY2pWrUHjOq1x6upEhyH9aOrkQL2m9XnzxjfT9r948RyRliaPnwWn+sz7/odUzz20dXSJjExdhiIyPFYucjp78gyiV6wgdMkSoi9fJmz5ciJXrULXzFzuiL6gVqIE7z9+P7HS3NwCP98g4uIUw1ef+gRSrFjxNMfo6egiCVessSSTyUgMj0BbO+tbLzKZjCXLF1OxegX6zpxCI4em1G/WjPDvqHP/iINHDqLbvgPaNZIf1ouUlCjQowcJunps37GB7n2qyR0RgH2zMigpJaUb9rxhw1pEEREKRQt1gDGxsRzesVWh7z9rluNTcC27dOzxVBnDJu1KaJcLYcSoUanmffnyBe+DAimQIppQxciIpLg49Nu3V+ir7+hI/OdwSuFIWTrQmLlUpS+24hGcOHQq41+SQK4jOKPfiBMnjlKwkCrjJjehkIkehYsYMG1OCySyaC5dOp+txxKLxXRu3xFr/97EKiVisdMdm8uXsLx2jc+ODnTs3ilV2Yj00NXVRSSVEhglY8U/l4iNFZMoTmKX+x1uXHvN8OGKsiydOjqz2/0+H/2/6mB7nnlCUGCMPBS4QoWKnD91gZYSKLR1O03jxJw4dAJxYCDiDx8U5os7fx67qt9Pai1a1Iz69RsxfeIJQkKikUqlXDr/nO2bbtOv39A0x/Tu0o0YNzeSQkKAZCcS4eGBsY7uT2kBHjt2mPX7dmF24gSF9u2l2JUrPDM1ZcioYZmeKyD4EyKL1M+7VCwsSEiIR0VF8TIgEolQUVFO9wZn+6YdaKLBt2tkdSApUdGhW1pacevebcYu70GjSQas2LaAI6eOoqWllWre6Ogo1PQNUm3hKevoyL/nLySFhSFKQ0xVTAzquRCcI5B1hG2634hnz55S1bawQptIJKKabVGePn1K48ZNvzMy85w/74l+ojXRKsHo9+iCZqXkqC+RkhIGvXoRdOAgN29ep06dvzI8p7m5BeXKlONtmdIcevqarTWWIgJU1VWp/1cTrKwUV23Vqtky3HUCTg5zqFbdkojwOAIDotm2bY9COKmlpRV/z1UsFjdqxGj+17cfumNGo1asGNEnTyI+dgzX04o5Pd/yzz/rmTFjAq0br0Emk2FRzJx167Z/17HY2zdjwIMHrG7aFP1q1UkMDEQrIQF39z0/9Uxu3fbN6I4ciWrh5N9bpKaG4fjx3Khdh+Dg4ExFNTWoVYcL7luQOTvLbZJERfH5+jX6DR7Gzu07aWhfGlXV5Iv6jWuviYlOSreOU2DQR1RR5xJxNPivLRFYBLRr0yFVf3V1ddq0aZ+q/VvKlatAUkgwcQ8fJtd1ItnJqxUoQMi8eRTZsAElTU1kYjHhCxZQ0MiUu5/+h5109H82xHFLaz4De2ZOqy+/ERAQkOqGQ09PDz29nwu1zyqCM/qNsLa2Ye+BkwptMpmMh94BNK5f4jujskZ4eBh6UguiVINQsVK8EItEIlTNihISknq7LT02r3GjY4/OBEZFoVGhMrGPH9GyaWvWr1qfZv8BA4bQvn0nrl+/go6ODn/91SBDeQ0jho3E0tyCNVs38unTJxrVqsOY455plkVIiZaWFosXr2Lu3CXEx8ehp6efrlOZMGY8vbv34s4dLwwNDeXCqN8SEhLCmvWruXD9KgWNCjK4Vx/s7ZulOWdYWBiq3wRmKGlqomZgQGRkRKackaNjO9ZucSPQxQWtLl2QREURs349nTt0YujQEdz39qKT42YaN7Mh8GM0ly+8ZNOmnemWb7CxKo3+02a0YTEdkGBNAu5oEqAipWfPPhm271vU1dVZOn8xIwcMQKdbN5SLFkV88hTm6hrYmBblQr166FWoQPSTp9S0rcGMPXvp3rk7L6L3YSQpzSvO0qBRfXr2yroN+QFnZ2f8/f0V2n4mGu5nEUK7c5DsDu2Oi4ujXv3qtHS0oWffmkglUtzW3ODWjU9cOH8rUyKZ6fHmjS9N6tlTJ2EGN6ruo8jezfKLclJYGO/tm3Dryq0sqR3IZDLu3btDUFAQ1apVx9S0cPqDfnNCQ0Np1KIhSbVqoeXgQKK/P9H/+x+j+w3GZXDqLcBJ0yZyTBxHwalftQPjHjwgcugwHt97nOnfOiYmhk1b3DjqeQYtTU16dexC+/Ydk/XoZDKuXLnEjRtXMTIqSLt2HTPk7Dw9T+PafxT14hYQxXuCech7tetMmDWGvv1Sl0DPLE+fPmGrxzYCQ4JpXPsvnJw6o6Wlxbt3b3n+/CnFi1tjbZ18E5aUlMTFi+cIDAykWjXbVOHl2cmfEtqdXSuj7ArtFpxRDpITeUb+/h+YPn08Z86cSa4j5NCaWTMXfbdw288wZeJkTuw6TwyJyGwt0e/ZBUlEBDHr19O9pSMzpsxIfxIBABYsmo/7O1+MFyyQt4nfv+djm7Y89vZBR0exlHhQUCCNWjRG9Fdd1O3tSXzzhhg3N5bOWUjbtqm3wHKLU6dOsHD2Il68eYSFqQ3Dxw3H2bl7bpuVo/wpzii7EPKM8ilFi5qxadNOefBARkpAZJW5C+ZRq64de3bs5YXvCyRLlmJtUYw+k2bQqpVDjh33W8LDw1i/fg1xcXF07dqd0qXLpD8oj3HZ6waafXortKmZm6NlaYmPjw81ayrWhjIxMeXSmUts2LSe69t2UNS0MJOOHKF48ZxXL88MLVq0okWLVrlthsAfgOCMflNy0gl9QSQS0bq1I336OGfrnWBmWLVqOYsWzcXKqhBxsYls3bqBxvVbsmnb1t9KyqVwIRM+vnun0CZLTCTu48fvbokZGxszZeLUFO+z945cQCAvIYR2C+RZXr16ydKl8/HY35f9JwZw4qIL85e04fylkxw8uDe3zcsUg3r1I3rdOuKfJ6shSBMSCFu8hHJlylK8uHUuWycgkPvkq5VRo0aNUkWP/AgLCws8PT1z0KLfC5lMxqFD+9m0ZiuhoaH81aAOI8eOSjdCLausXr2c9p2qULrs1wCHJs3Lsm3dPdauXEeHDp1z5Lg5gZ1dbeZOms70nj1RNjIiPjiYKpWrsnHd5tw27Y/B2/see3bvIi4qnio1quDk1DlDGnRv3vgSHR1NmTJlszUISCBzCN98PicxMZHTp0/y8uVzSpYsTbNmLb4bOr3k78V4rDvEX7FzqUoxnuzZRbOTTTh/5RImJhkvRREdHcXdu3fQ09OjSpVq391u+/w5ktIVUkf2GJvo8PZ1amWGvE63rt3p0L4jL148o0ABwzSFVwUyT2hoKL06OPDiyWMsUOEVIq4cvs3Kpas4cfbkdyM+3717S58h/fF964eqri5KsbGsWLScZs1a/OIzyD7GGRoSm05MmlYe3d7Ot86obdu2ckmZ72FoaPiLrMkdPn36hFPLxhiHhVInJoZN2tosMTJm38lzqZ5jREZGsGb1KgYl+KBHUQAKJ1VBHB3NhnXrmTZjeoaOuW3bJubOnU6p0oUJCYlGVUWLrVv3yEN0U9KuXSdmzxlFt5415QmZ4WExXLv+jFGjJv7k2ecO6urqaZaNEMg6zm2aU+vFc64BqiTxAaiX9BbN4ObMmT6HNW5rU42RSqU4de9EfBtHLPr1Q6SsTOzduwx2ccHz2FlsbLI3b+9XMeaclHcxP3ZGFtoiHqWWBMx18q0zcnV1xcwsZ7aXfhdmTxxDq4/+LPkvFFQWHc2o+HjmThnPig1bFPo+e/YME7XS6CUUVWgvkdiG29dSq1mnxd27t1mydA47D/SmmJURMpmMPTvv0rNnR65evZ8qKKNFi9asWbOcbu030qOvHbGxYtxWX8PEuCguLlkLH/38OZLZC+Zw+MhBpBIpzVu0YubkGTkSGv+7IxaLOXRoPycueKKvo0v3Tt1SRf3lNufPn+X5i+dcB76s582A+cQxU/qes55v0hzn5XWTSMB0wAD5ylyrenV0OnVim8c25syY+yvMF0hBvnVG+R2ZTMbxMyd5myInQQRMTEqixMljVN+xFTU1NZo1a4GxsS6mpqaEJPqSRAIqfK05FCzywaxYxhJfd+3aRvfe1SlmlSzjLxKJ6NytOnvc/+XevTvY2tZU6K+srMyRI55s2rSBnVu3I5FI6dHDhdGjx2Vpb18qldK2S3uCrCwptH8/IhUVrmzZQou2Lbh+4fpPFRqUSqW8feuHjo5ujhYg+1UkJibi1L0jL2Ji0HDqgDQ8nBODejN2sGuaSbq5hYfHFgqqKqORqJi8aQ7E8BF11bSr/QYHf0LNwjzVFrFSsWL43/35Etp/Km3atEnV9i5FlOju3bs5d+6cwueFChXCzc0t3bkFZ5SPSWsxLwISxGI8pnmRJIpl8vhJeOzZhp1dA6pXr87Z2640Fi9FHV3ecQMvjcXsdtmZoeNFRIRRroriA2WRSISxsS4REeFpjlFVVWXw4KEMzoYL4OXLF3nz0R/V6DA+tHNEp1IFdEeMJer5C44fP4KTU9YCIi5c8GTCxBEkJMQRGxNPjRo1+eefDb/1auvIkYO8jI7GZKeHXIhUt1Ur/m7dms4du2BklDfqAsXFxxClosS9RAkpJXC3AvEiEU6d09anq1bNlsgxIzCIjERZXx/4T2399GkatG6X43b/rjx79uyHn4eEhBDyjZhtVFTG0hGE0O58ikgkonXT5ixKscKQAXOBsrTGMdad9jEH6RJ3BucuvYiMjGDD1g0UahjOSjVzVmlZcNKoK0v/tzhDRdgA6tVrwvHDT0gp+vHRP4LHjz9Qo0bOb/9s3rwOI41Elk2ry5nTAxnWxJCgfr2QWFni88QnS3O+fPkCF5c+TJ3dEM+rw7hwcyTFrBPp1bsjv7O4yemL51Fr11ZBEVu1SBF0q1Xj5s3r6Y8/fRKHBrUob12UTi0ac+PGtRyxs3atBhQrU4RWmqosE8EJoI+aMjsB83JmdO/ZnRlzZuDUsytz5s8mICC5hEjRomb06N6ToG7ORJ44QfT16wSPHIVhaDhOTp2T5ZM2bqBXl96MHz2Wx48f5Yj9Al8RVkb5mOkLl+H04F9uR4RTJyaGcyoqvErUoi8b5X2KYouVUn3OnDlFp05d2bxjM+HhYURERGBhUSxdMc2UdOrUlT17t+PSby8O7coSFhrL9s13GDd2cqpaRtlNXFwcN29eY8+RfphbJAemOHWpRlSMmI3u5ykxekqW5t2+fSMdu1alVp3kXCENDVVGjG1Ia/v1PHz4b7rK13kVfV1dpGGpaydJQsPQ1dVNY8RXDh7Yy7zRrqyMi6MGcPHeHQZ06cD6nfvkpT+yi549+7Jz5zbK1rbmaHQ8oQGRfIxMwKGdIwMHDqVF2xZotWmbXBn29h222f/F8QPHKV26DHOnz8G2UhU273InKiaGbvZNGbBiLRJJEq2atEQ5oBil4jrzTsmX9gfas2jF37Rtm77q+J/M8//y5HKCfOuMfHx8OHfuHEFBQSgrK2NgYECZMmWoUqVKmjVW/kRMTEw4f8ub06dP8OLFc/Tve1PhnC06KIZpq8g0SUxMlL8vUMCQAgUyH2moqanJgf2n2LPHg4tnTqOnZ8DaNTuoVavOT59Lenz8+AF9A225IxW+72YAACAASURBVPpC7TpWuK2+mqHSBmnOG/CevxoqblkpKSlhZW3Mx48f84wzkkqlBAUFoqurm0oHLy16dHHmYPfO6LZqhVqxYgBEHj2KUmjoD8uGyGQyFs+cintcHF/cjjOgFB/HsllTqet5JRvO5iv6+gacOHGBDRtWc/myJ6YlrRjj3J9WrRxo5eSIzsiRFOjaFZlMRoyuLtFPn9CldzfW/bMGO7tatG3bIZXW3/JlS1H3L0PbhF2IEIEUbOJaMnFsK1q2bJ2t9gt8Jd86o+HDh6fZrqWlRceOHRk6dCj6/+0l/8moqanh6Ji8R37r1g3633ChVuwYNEjO74ngLS8lp7G3n/VTxwkLC8Xf3x9LS0t69+5P7979f9r2zGBiYkpkZCwhIdEULPj1udXjhx+pUqVaumH+36N6tVpcPL+flo5fy2xERsbx7z0/Ki/PG47o7NlTTB47lYiICJKkCbRs4cCi5Yt+6JQqV67K9HETmdmuHboVKpIUEY7q5yj2bN/9w+CRuLg4PoQE8627agIMfZEzd9WGhkZMnDidiRO/phdIpVLuXb9KyXVrAAiaM4foK1cw6NyZxMREnF3607tjZ6ZNSp2S4HniIhUSJpNEPK85SxLxWNEYbWkhfHweUbRogxw5j/xOvnVG3yM2NpZt27Zx7tw51q5dS6lSpXLbpF9GzZq1aNmhCZsPVKFsXA8kyrE8VNnGvIVzMDExzdKcYrGYyZNHcfjIIQoXLkBAQDj9+w9mwvhpv1RbTkdHl27dejBx9FFmzmtBUTMDbl735X/LrrBx464sz+vs3Itt2zYyZ9pJ2jpVJDQ0hnWrbtCla/csldfIbh4+/JehA1xpE7cLKxoSTwSep0cy+PMQ3Pe4/3Bsn179aN+2A7du3URHRwc7u9rpbstqaGigr6nFk+goUhZx8AYsfuH3IRKJ0PivMqwkJIQoT0+KnzyJ8n9bjEldurCpRQu6OHWhRImSCmP19fV4yxWOqnfDpmQhtHXUOHW/PySq5FrhufxAvnJGKioqNGzYkEaNGlGxYkXMzMxQV1cnIiKCR48esXfvXi5eTK4E6u/vz8CBA9m/f3+WQ3WzSxb+V7J521quD7zOoYNH0dBQZ63zBcqVy3ptmLHjRvPuwz1OXxqKnp4mn4I+M3zwPqyLW+Li8jVC7s2bN+zbt4/ExETatGlD+fLls+N0FFi1ciUzZk6jW/u1xMbFY2VpgZvbVhwdm2d5TmNjXW7dus2ixX8zb/px9PT1GT1yBr179/5pZ5uYmMiFCxeIjIykfv36gC7GxulvsaVk28at1IwfR3EaAaBJAVokrGfVTXNiY8Mo9t8W3PcwNtbFxibjShF79+wjOj6RzihzAAmlgPuAi5YWs+fMzrT9P0PfPn3YvWABMisr9Bwd5Y4IQMXQEN3mzfHyukLt2oql6AcM607vOz1ZuaEztesmPwt8/y6MTo5uaGsnZzP9yvPIL+Srekbh4eEUKFDgh30OHz7MpEmT5CUa2rVrx8KFGUvq/JacqGeUG2RVLTopKYnSZSw4cHwAhYt83fK8d+ct82de5eqV+wC4b9/OjKkzKCvphIpMAx+VXfQd2JuJUydn2zmkRCKREBcXh7a2dp5V/n706CHOnbqilVAUbQrhm3iF6TOm0Kf/oEzN09regZIPJ2ODYkn6HXq1WO4+Ezu72tlmc0REOFUrVsY5/iJ+HOcWf5NEPCBh4PCRTJo6M8NzRUdHsfZ/Kzh7cB+qqqq07dGHPv0G/rDKb0xMDMeOHcbX9zUVKlSkfv1GuIwaxsXzZ9Fu3ZoiKWpJAYSMHMW4eo3o1auvQvuxY4dZt2EmW3b2VGhfsfQC6kqVWLVqZZ6tZ1Th8OcMKjDkvRVerq+M3N3dcXf/8XZBZnFzc8PcPPXdXHqOCJJlgt6/f8///vc/AI4ePcro0aN/65yR3CI+Ph5xghgTU8W7SItihgR/Si5ZHhQUxLQpU+mbcAd9LHjKAaKSQlm3eh0VqlTIlrpJ3t73WDJjKvceelPEuBD9Roymm3OvPOuIJBIJPbp0p07oIirQBYDP+LNkbh1KlyufqYAP21pV8X56ApvEr84oikCCEp5RqlTpbLXb0/MMxZXrU5hKFKYSNZlIAp+5JVpOfMLnDM+TmJhIp1ZNKe77itUJCcQD8xfMxuvyBRo7tOWS5zUKmRrRvVcPeW2rN298ad3BAUqVgvLlkK77H4bLl3D8wFGePPGhS6+uxPfujcZ/2+5xDx8SfeUKrRetSHX82NhYjAqmvljr6akT9ikma1+OQLrkujMKDw/nzZu0JTuyilgs/qnx/fr1Y+PGjcTHxyORSLhx4wZt2+ZBMadfwL17dzi2z4PggE80aO1I27Ydfnh3mhJtbW2silty7fIr6jX8ui/vefoJtjWS1RY8PU9TUqkFehRlB02RIaU8ndGWGOMywIW1G0U/FcH0+PEjurVtxYK4WHYAT976MXzKRMKCg3EdNS7L8+YkXl43UYkzoDRt5YoXehSlatwIdm7blSlnNNBlEI13N0QtSp9y0m5E8pbLWpPo13dAliIif4RUKkXE12dKSiijSQGUUEEqkWZ4npMnj6H+zo/dCQl8uV2oGxeHxYXzPLweSaX4gbxQ9sNhZ2uWrlqKo2NbRk0ai3J3ZwwHDABA5upKyNRpzF+8gMXzF/PP38sZ3bUretVtkUmSiPn3Aev/tz7N5N0GDRoxZepYAgMiMS2cvKJPSEjk2KEnzJqZuZWpQMbJdWeUF9HS0qJSpUp4eXkB4Ovrm8sW5Q6bNqxl1byZuCYkUFUqZcvli+zfvhn3gycy5JBEIhEzpi9g6LC+DHQJp1yFIty6/oZdO+6zb98JeR+ZSMp9NqKGNl05htJ/udhlk5wY7doGe/umqKmpZekcVi+ez+T4OAb8994EOBwXS40VSxkwxPWnJIByCj+/N8SIAliknHwhLKVuj33sWjRkBYiOis3UXIULF+HUuTMsWbCEw1dbYVjAiDEuA+ja1Tnb7ba3b8YkyUSCeYYxyauuWMJ4pLGZMW03pjP6K/du3aRNTAwp163qQAsZfIrvQVX6gQRKxLVh/KhW1K/fgNvXr2Gz6usqRyQSode/H8d69GTx/MV06NARe/smXLx4HmVlZRputv9ueQkTE1PGjJ6Is9MyOnWtjJa2Gof3P6ZcuRo0bGifla9GIAPkujNydXXNcs30nCRl0EJEREQuWpI7hIeHsWD2NP4Vi7H6r613bAz1Hz3iyJGDGZbOadSoCR7uh1i/YSWnjnlRvlxljh1bLFdFbtq0BdMmTiWcAGoxWu6IAMyxQ0dWmAcPvFPp1mWUJw8fMP2bx6LWgL5IxMePHyhe3CZL8+YU8fHxLF06n859y9C7f22Qydjq5oWHWz30lMwY6dgj03MWK2bJqnX/ywFrFTEyMmLBor+ZPL4OZaWdUJFo81RtN116dKJGjYz/foXNzfHR0IB4xTIhPqhjw9ft96JUR4fC+Pg8RiQCpN+svpKSEKUQ39XXN0iVU/Q9hgwZjp1dHfbv30VESBzTpi7F3r7ZL6mwnF/JdWeUV4mLi5O/1tTUzEVLcoc9e3ZRIYUjAlAG+sTGcPro4UzpuFWtWp3167an+ZmxsTF/L13MWNfxxMsiFT6TISNeGoWmZtaTkC2LW3PH/wMVU7QFAeESCYUKZbwG06/ixImjWFjq4jK8gbzNZWQ9rl99RVJcFO3bd8w9475DfHw8vr6vKVjQmM5dulKrdm2OHj1MQkI8s5vuoUKFiulPkoKOnbpRb/FC9gAdAQmwEvBFjRa0lPeTIiVWEoGhoRF1GjTi6caNGP2XPyiTSolct44ObdLXmQsJCWHDunXcuOSFaRET+rv0xc6uNlWqVKNKlWrpjhfIHgRn9B1SCgL+CSrMmWXfPndE6iqQkKTQ/gnQNUg/ECQzdOzUmQRxPAsnzKdUogOaJM/vLdqIvrEm5cplPcx70JgJDLp7G4u4OOyBN8AATU26de2eISWCX82bN76Uq5A6WKZ6TQssijTJ8PO6X8XWrW4sXDibAobaBH+KpGHDxixfvpZhw0Zkec6CBQuyY/8Rxg7ux4igIJJkUkxNC6McpEx8fCTaFESGjDui/1GoiCGlSpVm+YIltO7gwKdbXiiVL0fizVuYa+swcdnqHx7r3bt3ODRvhdnnJpQSTyLs4Ut6X+7HzIXT6NK1W5bPQSDzCM4oDW7duqVQntzW1jYXrfn1SCQSfHyeUKSAFrsTkv6L5wI/YDGws1efbD+ms3NPXj57zZptJbBRsSdS9JZ4zUD2euz7qai32rXrsmjtJkZMnYBfYACaaur07juAsZMzVgzwV1O2bHn+WbEbmUwmP2+ZTMbtWx9oMydvKDp84dy5M6xctZCtu7tT3NqY2FgxC2adZcwYF9av3/FTc1erZsuF2w94//4dqqqqmJoWZv6cuax1K4mV6l9E8BZl/Xh2u+9GJBJRtKgZXle8OHPmFG/f+lFuRmvq12/43W21Z8+eMmbqeO7dvAEyEQVUYihMNWxohkXcX8yY2ox27Tugrp52CQqB7Cff5BnFxMRkSPIlIiKCzp074+fnB4ClpSWnTp3K0l7x75pnJJPJsLEpwtJV7Zk95iCF4hMpKIJbYglK6hq8eB2QY8d+9+4tt27dwMjIiPr1G2WpblFayGQyYmJi0NTUzJS4668mKSmJ5s3/omQZLfoMsEOGjM3rb+H7MoG7d70JC8tcAENO0rWrI/YtC+DQ9mvl2tiYBOzrruTWrUcULFgw248ZGBjA7du3MDIqSK1adbL4dxlKrQZ2aLq4oN+xI7L4eEIWr0Tl8BMGx91ChIgNOmXwOLY5zVV5VvPuvoeQZ5RMvlkZde7cmbp169K2bVtKl047v+LGjRvMnDmTt2/fytvGjRuX7x5aikQiOnXqwpED9zh0eSQPvd8TER5H7P6H2FbLWaFIC4tiWFj8WBUgK4hEou9GT+UlVFRU2L//JIsWzaVv92ShTgeHdvy9b2qec6KfPgVhaaUYAKKlrY6hkS6hoSE54oxMTQvLtRSzyu49HqjVqUOB7t2TG9TVKTRnKu8ut+Jt3FWKUoOoxGAMDbM39F3gx+QbZxQbG8uWLVvYsmULxsbGlCpVioIFC6Kurk5kZCSPHj1S2JqD5Eg/e/v8Gco5depcBg3uSevGayhXwZwH/77lr7oNGD16Ym6b9sdjYFCA+fOXMn/+0tw25YfY2tbm3JnnVKhkJm97+TyImGgxlpZWPxiZu7zw9UWpomJQhUgkQqNSRYI/PuWF6kGqV7fNE9qC+Yl844xSEhwcTHBw8Hc/NzQ0ZNq0abRs2fK7ff50tLW1cd9xgOfPnxES4o+pqQXW1iVy2yyBPEJoaCja2rps3XoPiUSCfbMy+PmGsHbVdSZOnJmnn7VUKV+ec+fOQI+vYfKypCQib1/iktp5qlSuytpN6ZfJzousMdUhPuHHfTTy6E+Tb54ZBQQEcP/+fby9vfHx8SEsLIzw8HBiYmLQ0tLC0NCQ8uXL89dff9GyZcssJ1mm5Hd9ZvQt2b1HLpA18srv8PatH46OTahZ25wSpQ05fvgRH/0jKV++EsNdx9OwYePcNvGHREdHU6dRHSRNm6DXvTvS6GgiV67ELCyCDavWYWVV/Ifj8/Izo16uSQR9/z4bABNj2LYq761D8o0zyg0EZySQneSV32HQ4F6YFYtk0LCvVVv377mH58kQDh08k4uWpc2rVy+5c8cLExMT6tVriIqKCoGBAcxeOJezZ0+hpqFJ5w6dGD96fIZyCgVnlDPkPYsEfnskEgkikSjfBX7kFy5eOM+hUwMU2tq0q8S8GQtJSEjIM1t0UqmUUa6jOHnsJDZK9oQpvUSiO4F9h/djZVWcNf+kzkGSyWS8ePGcuLhYypWrkOfyuv5khKuFQLbx+vVLujm3w9y8IFZWpowcOZiIiPDcNksgm9HR0SY8XDHE/PPneNTUVLMtFD872L3bg5snfBga/xqHWHd6RXtRNsiFQX0Gp9n/9euX1LWvR8su7ejsOojy1cpx5sypX2x1/kVwRgLZQkREOO3ataCKrQo3/53A6UvDSJK9wtm5PZnZCb5x4xpDenahY5P6LF4wh7Cw0By0WiArdO7cnVVLLyP+T51DIpHyz+KLtG/vlKfCzz0278EudgpqfM0vtJW68sb3DW/f+in0TUpKon03J6Kd2mN26RKFT55Ef8UKBo8Ygq/v619sef5EcEYC2cLu3R5Ur2lGr3610NRUw6igDtPmtCA07CNeXrcyNIfH9i0M7dqBhqdPMvGBN6FrVtKyQW1CQkJy2HqBzDBy5Hh0ta1pVv9/jBp6iJaN1hD6SZOZMxekP/gXEh8fjzqKkk9KKKOmpEVCgmLI2dWrlxHr6VOge3e5uKpW9erotO+Ax26PX2ZzfkZwRgLZwuvXz6lYWVF4VCQSUbGyGa9fv0x3fHx8PHNnTOZsXBxDgebApoQEGoWFsnHtqpwx+hcRHx+Pp+dpTpw4xufPkekPyAFkMhkPH/7LuXNn8PPzIykpKf1B30FdXZ2NGz04dMiTzk6j2b7tMPv3n0RXN29l9bds2wxv9TXI+Loyf8UZ1HVEctX4L4SEBKNibvbtFIjMzQgI/pTjtgoIzkggmyhdugL37nxUaJNIpNy/+1ZejfNHPHv2hCIiJcp+095VLObm+bPZaOmv5caNa1SrVpoVK6eyZdt8qlYrw549v/ZOOygokEYtG+PYrSODhvendu3KWFsXZtLk0Qrq9JmlZMlSODq2y7Qq969i0ODByKz82KndCC9WcUbNleNaPVixdkWq4JoaNez4fP06ks9fK9LKpFIST52iYe26v9r0fEneedoo8Fvj5NSJhX/PYsXS8zj3qklsdALLFp3DyKgwVatWT3e8oaERQUmJiIGUGV5vAUPj37Pke3R0NH37dmPRP47Y1UnOXXn9Kpg+XSdQrVqNVHfnOUW/oQMJKGEDb14wZ24LGjUpRUhwNPNmnGb0mCGsXbP1l9jxq9HR0eWk5ymOHj3EzStelDczYbXzZczMzFP1LVbMkm5dnDnQtRvagwaipKtL3O7dFJFIf1p+SCBjCM5IIFu4cuUSMmNTDr3VZlvjNShrqKNha4vI/yESiSTdKCsLi2KUq1CJKd73mZ+UiCrgC8zW1GLhkGG/5ByyG0/P01SoXFTuiACsbYxxaFeBAwd2M2HCtBy3wd//A48eP0THxJC+fWyxb5a8Si1koseCZW1p+tcqPn70p0iRojluS26grq5Ox45d6NixS7p958+ch13V6mzdu4vYuFgcmzSnT69+eSZU/U9HcEYC2cLuIwfR6d8fAycnUq5jAtu04e7d29jZ1U53jv9t3YlLzy6Y+zzGQlWVV0mJjJ04lUaNmuSc4TlIdHQ0+vqpy5obFNAgOurXJK9+/vwZNX19+PCWiq0VN0G1tNSwKl6Id+/e/bHOKDOIRCLatGlPmzbtc9uUfInwzEggW5BKpZBGkqtIWTn5swxgbGzMvlPnOXLpBtN37ueez2sG/KarIoAGDRpx5eILQkKi5W0JCYmcOPIUe/sWv8SGEiVKohyfgMTIhOs3/BQ+iwiP5fXrIEqUKPlLbPkREomENWtWUKdOJcqVt2KIS2/evPHNbbMEfiHCykggW+jYug2T1qxEr1UrlP7b1ojx8kISGEj16jUyNVfx4tYUL26dE2b+UszNLRg0aBjOHdzo7FwFTU1VDux5RMWKdtSr1+CX2KCiosLS+YtwGe3KnqQEChpq0sqhPB/9I1my4AJdu3bHyMjol9jyIyZMGMGzFzeYtbAxxoV0OHroEY5tmnDO8wYmJnmvPLxA9iNo0+Ug+UmbTiKRMGDYQK7cv4t68+aIPn0i5sJFNq/blOeFM3OaW7ducuDALsTieJo3b0OzZi2yJJX0M5poPj6PWbpyGd73bvI5IoJCxsb07j2IAQOG5Lps08eP/jRoUIMzl4ehrfP1+cyc6acxM/3rlzxbywyCNl3OkPcsEvgtUVZWZtOajXh53eLKlYsUqGpJ29mLMDY2zm3Tch07u1rY2dXKVRvKlSvP5vWbc9WG7/Hs2RPKljdTcEQAteoU49QR71yySuBXIzgjgWxDJBLliQuvwO9FsWKWvHweQKI4CVW1r5ekJ48DsbRMP0dN4M9ACGAQEBDIVaytS1Clqi0zppwkLDQGiUTKmZM+7N/9L336DMxt8wR+EcLKSEAgi/j7f+DUqeNIpVKaN2+FhUWx3Dbpt2Xd2q1Mnz6elo1WI5FIKFW6JFu37qV4cZvcNk3gFyGsjAQEsoC7+1YaNKjBXe99eD86gL19bTZuXJvbZv226OjosmzZWp49e8fjx685e+a6sN2bzxBWRgICmcTf/wOzZ09h18E+WFgmh0UPGlqHLm3n0ahRE+Fu/idQU1NDTU0t/Y4CfxzCykhAIJOcPHmMxk1Lyx0RQJGiBrRoXY7jx4/momUCAr8vwspIQCCTSKVSlJRFqdqVlEUZVpsQEMgJJtRXQRz94z5q2ZPSlO0IzkhAIJM0b96KZcvmM9ClNoWLGAAQ/CmKk8d8OHJ4RS5bJ5CfOTsWIt/+uI9+MSjr9GvsyQyCMxIQyCTFilkyZsxkOrdZQEuHcigpizhx1Ichg0dQsmSpbD2WTCbDy+sm586dwdjYkGbNHLG0tMrWYwgI5AWEZ0YCAllg4MChnDhxEYuiTShSqBGHD3kyfPjYbD2GTCZj5MjBuA7vRSLePHt1kmbN/uLAgX3ZehwBgbyAsDISEMgi1tYlGDkyex1QSs6dO8O9+1fYf7wfmprJEWZOnSvTq+sImjZtlufKfAsI/AzCykhAII9y4uRhOnSuKHdEACVKmVCpsgVXrlzORcsEBLIfwRkJCORRVJRVEYslqdrF4vQr5woI/G4IzkhAII/Svn1n9nh4Ex4WI2+7e9uPl8+Dflk9pN+NBw/+ZePGdTx+/Ci3TRHIJMLtlYBAHqV27bp07NiTNs3X09C+NFGfE7hzy4/167ehqamZ2+blKaKjo2n+V20++PtRCmXmIsGymDWnrtwQvqvfBKG4Xg6Sn4rrCeQcvr6vuXjxHIULG1O3bmP09PRz26Q8R+smjdB+cJ+jSNEBYgBHlJDUqs2+Iyez9Vh5ubjeP5YZyzMa6Zcth8tW8vTKKDw8nIcPHyr8i4iIkH9+/vx5zMzMsjS3t7c3Bw4c4O7duwQFBaGsrIypqSm1a9fGycmJkiVLZtdpCAj8FF/KsAs3BWkjlUp5/OAu94Evl3RtYB1SKt+6nouW/ZlER0dz6NAhzpw5g5+fH5GRkRgZGWFtbU3Lli1xcHDIkr5gnnVG/fv35+rVq9k+r1gsZt68eezevTvVZ1FRUbx8+RIPDw+GDBnC0KFDEYlSy74ICAjkHZKSkkgAvr0tNQPiZDJkMpnwd5xN3L17l3HjxvHx40eF9oCAAAICArh27Rrbtm1j+fLlWFtbZ2ruPBvAEBycTiH3LDJp0iQFR2RpaYmjoyOtWrXC1NQUSP7PvWrVKlasEKRdBATyOmpqahhp6ODxTbsHUFjXQHBE2YSPjw8DBgyQOyJVVVXq1auHk5MTNWvWREkp2Z08f/6cXr16ERgYmKn58+zKCEBFRYVSpUpRsWJFKlWqhLGxMf369cvyfHv27OH48eMAKCsrM2XKFLp16yb/z/rFCa1btw6AtWvXUrNmTWrVEuqqCAjkZSYtWMCoUa68RIkGSLmMEquRsmzx0tw27Y9ALBbj6upKbGwsAOXKlWPNmjXyG3iAV69eMXjwYN6/f09wcDBjx47F3d09w8fIs85oyZIlmJubo6GhIW/78OFDludLSEhg9erV8veDBg3C2dlZoY+KigqjRo3i48ePHD2aXApg+fLlgjMSEMjjODv3wtS0CHOnTGZnwEeMzMzYvuBvIQQ+m9izZw/+/v4AGBgY4ObmhpGRkUIfGxsb1q1bR7t27RCLxdy5c4fLly9Tv379DB0jz27TlShRQsER/Sznz58nKCgIAH19fQYPHvzdvmPHjkVZWRmABw8e8Pjx42yzQ0BAIGdo3LgJF2/d4d+3/py/7iU4omxk586d8tf9+vVL5Yi+YGNjQ7t27eTvd+3aleFj5FlnlN2cP39e/rpFixaoq6t/t6+JiYnCasjT0zNHbRMQEBDIq7x58wZfX1/5+5TOJi1Sfn7jxg1iYmJ+0Psr+cYZeXl5yV/XqFEj3f4p+6QcKyAgIJCfSHn9s7KywtjY+If9K1SogJaWFpD8eOTff//N0HHyhTP6/PmzQnRe2bJl0x2Tsk/KuwIBAQGB/MTr16/lr8uVK5dufxUVFYU8zZTjf0S+cEZ+fn4K74sUKZLumMKFC8tfR0ZGEhYWlt1mCQgICOR5Ul4/U14Xf0TKKLs3b95kaEyejabLTsLDw+WvdXR0fvi86AsFCxZUeB8REYGhoWGmjquk9OfkN/xJ5/I7I/wOeYPs/B2ycy69DAjSfOkTEBCARKKoCq+np4eenmKdrJSqN99eF79Hyq28yMjIDI3JF87oS2w8kOEIvW/7pZwjoxQooJ3pMXmV7NLOEvg5hN8hb5BXf4e+1zLWLz4+njZt2qRyFMOGDcPV1VWhLeW1LyM38t/2y+i1M184o4SEBPlrVVXVDI35VlspPj4+W20SEBAQyC3EYjEHDx5M1f7tqgh+/vqZ0WtnppyRu7t7pjJqM4Kbmxvm5ubZOue3pPTSiYmJGRojFosV3mdnzpOAgIBAbpLWdtz3+NnrZ0avnZlyRuHh4Rl+GJVRvr3o5wRfwgwh4176234p5xAQEBDIL6S89qVcJf2IlP0yeu3MF9F0BgYG8tfR0dEZ+kJDQ0O/O4eAgIBAfkFf/2v9rJCQkAyNSdkv5fgfkamVkaura6qHW78DVlZWCu8/fvyYqu1bUkqk6+vrZzqSTkBAQOBPwMrKSl7OJyAgIENjU9DoFgAAC3hJREFUUvZL71r7hXyxMtLT01MINXz69Gm6Y1L2KV68eI7YJSAgIJDXSVmX6MmTJ+n2T0pK4sWLF2mO/xH5whkB1KxZU/769u3b6fZP2SflWAEBAYH8RMrr35s3b9LdqvPx8ZGHc6urq1O5cuUMHSffOKPGjRvLX586deqHz42CgoK4ceOG/L29vX2O2iYgICCQV7GyspLvDslkMg4fPvzD/ocOHZK/rlWrFtraGcu3zFfOyMTEBEjOKHZzc/tu32XLlskzkytVqkSFChV+iY0CAgICeZFu3brJX2/atOm78mivX79WyF9KOS498o0zUldXZ+jQofL3a9asYdeuXchkMnlbUlISK1asUPD8o0aN+qV2CggICOQ1OnfuTNGiRQEICwtj4MCB8vpwX3j9+jWDBw+W7zrZ2tpmuLAegEiW8mqchzh//jwrV65UaEtMTFRQgLW2tk6VEdylSxe6du363XlHjx7NiRMn5O8tLS2pVKkSEomEe/fuKUSBDB48ON86o/DwcB4+fKjwL6VG1fnz5zEzy4AQVhp4e3tz4MAB7t69S1BQEMrKypiamlK7dm2cnJwUFH/zM9HR0Rw6dIgzZ87g5+dHZGQkRkZGWFtb07JlSxwcHFIphQikj1gs5tmzZzx69IgHDx7w8OFD/Pz85DemaUniZISQkBAOHjyIp6cn/v7+REVFYWxsTJkyZXBwcKBp06YoKf2+9/8+Pj44OzsTFxcHJKss1KpVC2NjY/z9/fHy8kIqlQLJ2nT79u3LsLAq5GFndPDgQSZNmpTpcen9RxKLxcydO5c9e/Z8t4+KigpDhgxh6NChiET5T5iyf//+8lDO75EVZyQWi5k3bx67d+/+bp/8/t1/4e7du4wbN04hxeBbSpUqxfLlyzMcrSQAhw8fZtq0aT9Mts+KMzp37hxTpkxRuGH7lho1avy/vbsLieJ74wD+bbUV7EeKqVki7NaqUOhKqLFSV1KZwaoXkulFhGUr2otRFxJ1IUEEvpChSBJ4EdmSbqFFkhl5I5lKBlkUuoammFH5FqRu9r9YPP8zu+7Oajvu2/O5mtEz49k5I8+cnXPOg/Lycva6wBM5cl/GxMSgqqoKKpVqVef2ibXpeHK5HGVlZcjMzGRP55OTk5DJZOzpPDs726efzvncT85UWlqKx48fs32FQoH4+HjWK52YmIDJZMKtW7dgMplw/vx5Serh7gYGBnDq1Ck2Imnjxo3QaDQIDw/H6Ogoenp6sLS0hI8fP+L48eNoamoSLNlPbJuamnL6qi+dnZ04e/Yse88cGBgIjUaD4OBgGI1GvHnzBoB5hG5+fj7u37+P//5zz4VWxSQmJqK1tRUGgwFtbW0YGRlhGQ1UKhXS09Oh1WrX1GN3254RcZ2MjAwMDg4iNjYW8fHxUKvVCAsLQ35+Piuz2p6RXq/H1atXAQB+fn64fPkycnNzWe9nOQjV1dWxYxoaGgTp333BwsIC0tLSMDY2BsCczKy2tlYQbAYHB6HT6TA6OgrA/N28s9eM9FYNDQ24fv06tm3bxu5ttVqN8vJyFjRW0zP68eMHDhw4gLm5OQDA/v37UVFRIVh1oLe3F8XFxSyVTWZmJm7cuOHkT+b5fK5nRMSVl5cjKipKsMDhly9f1ny++fl51NTUsP3Tp08jLy9PUMbf3x8lJSUYHx9HS0sLAKCqqsrngpFer2eBKDg4GPX19diyZYugjEqlQl1dHbKysrCwsICenh50dnau6mWxr0pLS8ORI0esUmc7uhq1pdu3b7NApFAoUFNTY5VmITExEZWVlThx4gQAoKWlBSdPnkR0dPSa/qa38ty3aUQy0dHRTl2lvKOjg428CQoKgk6ns1n24sWL8PPzAwC8ffsW7969c1o9PMG9e/fYdn5+vlUgWqZSqZCVlcX2GxsbJa+bN4iIiLAKRGu1uLiIpqYmtn/u3Dmb+X5SUlKwb98+AMDS0pLd96a+ioIRkVxHRwfbPnz4sN0EXVu3bhX0htrb2yWtmzsZHh6G0Whk+3ywWQn/+66uLvz69UuyuhFr3d3dmJ2dBWDOIC02OZ5vr+fPn0taN09EwYhIrru7m20nJyeLlufL8Md6O/6zKpVK0Sf4uLg4tjz//Pw8+vv7Ja0fEeLbKyEhQfSlPX9fT0xM4PPnz1JVzSNRMCKSmpmZEYzO27Vrl+gxfBm+p+Dt+Dl0u3fvFi3v7+8vGPXJH0+kt9r2Cg8PFzxgUHsJUTAikrJ8+tu+fbvoMfxEuenpaZtLj3gb/lo5OlmQH2Xn7MSXxD5qL+eiYEQktTycFTB/r27vfdGy0NBQwb69iYTehP+cltfAFv5Je3p62ul1Iratpb34ctReQhSMiKSWJ24CcHiEnmU5/hzejP+cjgRty3K+cp3cxVrai7+3qb2EKBgRSfGpOhydy2H5Ivj3799OrZO7+tdr5SvXyV1QezkXTXr1EHfv3nX6LPv6+npERUU59ZyW+CfGxcVFh46xXK7FmXOe3Nm/XitfuU7uIiAggC0aSu317ygYeYifP386/YWns9foWsny0GPA8SdBy3L8ObwZ/zntJX/k8eV85Tq5i8DAQBaMHG0v/t6m9hKir+mIpIKDg9n23NycQ/+0379/t3kOb8avZyaW2nmlcvzxRHpraS/+3qb2EqKekYc4c+bMmnKsuJpSqRTsj4+PW/3MEr88fVBQEEJCQiSpm7tRKpUsdQefV8sevpzYdSXOpVQq2Tw4aq9/Rz0jIqnNmzcLhh9/+PBB9Bi+zI4dOySplzvi8xK9f/9etLzJZMKnT59WPJ5Ib7Xt9e3bN8EEcGovIQpGRHJ79+5l269fvxYtz5fhj/V2/GcdHh4W/epnYGCADQ8OCAhAQkKCpPUjQnx79ff3iw5i6OnpYdsRERFQKBRSVc0jUTAikktNTWXbT58+tfve6OvXr+jq6mL7YotPehOlUsl6gn///sWjR4/sln/48CHb1mg02LRpk6T1I0LJycksSd7s7Kzo4qd8e/H/E8SMghGRXGpqKku1PDU1hfr6eptlKysrWcZMtVqNuLi4damju8jNzWXbd+7csbkU0tDQEAwGw4rHkfUhl8uRnZ3N9qurq22OUH316hV7HyiTyZCTk7MudfQkFIyI5AICAlBUVMT2a2tr0djYCD7JsMlkws2bNwW9gZKSknWtpzs4evQoIiMjAZiziBYUFLBcUMuGhoag0+lYDzMpKYkS67lIQUEB6x0ZjUYUFxdjZmZGUKavrw8lJSXsftdqtYIFbokZpR0nVjo6OlBdXS342eLiomCV4Z07d1rNOs/JycGxY8dsnvfChQt48uQJ21coFFCr1fjz5w/6+voEI410Op1PBiPA/C4oLy+PzWGRy+XQaDQICwvD2NgYuru7sbS0BMC8Nt2DBw8cXqiTABkZGVY/GxkZYe/fQkNDrdaaCw8Pt9mjf/nyJQoLC1mbBAYGIiUlBUFBQTAajSydOWBOiqjX61kAI/9HwYhYMRgMKC0tXfVxxcXFdoefLyws4Nq1a9Dr9TbL+Pv7o7CwEEVFRdiwYcOq6+Atent7cenSJcEwd0sxMTGoqqqCSqVax5p5vtjY2FUfExkZiRcvXtj8/bNnz3DlyhW7i/omJSWhoqKCfWVNhGieEVk3crkcZWVlyMzMRHNzM3p7ezE5OQmZTIaIiAikpKQgOzubvsIAkJiYiNbWVhgMBrS1tWFkZARTU1MICQmBSqVCeno6tFqtaEI3sj4OHjyIPXv2oLm5Ge3t7RgbG8Pc3BzCwsIQGxsLrVaLQ4cOQSajNyO2UM+IEEKIy1GYJoQQ4nIUjAghhLgcBSNCCCEuR8GIEEKIy1EwIoQQ4nIUjAghhLgcBSNCCCEuR8GIEEKIy1EwIoQQ4nIUjAghhLgcBSNCCCEuR8GIEEKIy1EwIoQQ4nL/A5EqK9clQF4KAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualize result.\n",
    "train_new = False\n",
    "n_train = 70000\n",
    "predict_new = False\n",
    "n_predict = 70000\n",
    "vis_dim = 2\n",
    "build_anim = False\n",
    "    \n",
    "vis_data(x_train_encoded, y, vis_dim, n_predict, n_train, build_anim)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sklearn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.21.3'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sklearn.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
